summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Somers <asomers@gmail.com>2017-06-27 21:03:24 -0600
committerAlan Somers <asomers@gmail.com>2017-07-01 21:44:32 -0600
commit899d20bf5013f8fc30c3fb5d0ee887d00a717385 (patch)
treec134d245dad68b073079efe4c09e4301b4e90c7d
parent274b09eee1cdac51ceea9238d2e584babae48720 (diff)
downloadnix-899d20bf5013f8fc30c3fb5d0ee887d00a717385.zip
Skip the mount tests on buggy Linux kernels
Starting somewhere in 4.4.0 some versions of Linux have a known bug with tmpfs in namespaces. It's unknown exactly which versions are affected (and likely distro-dependent), but easy to detect. When open(2) returns EOVERFLOW, skip the rest of the test. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1659087 Fixes #610
-rw-r--r--test/test_mount.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/test/test_mount.rs b/test/test_mount.rs
index 42670216..57ff2106 100644
--- a/test/test_mount.rs
+++ b/test/test_mount.rs
@@ -17,6 +17,7 @@ mod test_mount {
use libc::{EACCES, EROFS};
+ use nix::errno::Errno;
use nix::mount::{mount, umount, MsFlags, MS_BIND, MS_RDONLY, MS_NOEXEC};
use nix::sched::{unshare, CLONE_NEWNS, CLONE_NEWUSER};
use nix::sys::stat::{self, S_IRWXU, S_IRWXG, S_IRWXO, S_IXUSR, S_IXGRP, S_IXOTH};
@@ -49,6 +50,23 @@ exit 23";
.write(true)
.mode((S_IRWXU | S_IRWXG | S_IRWXO).bits())
.open(&test_path)
+ .or_else(|e|
+ if Errno::from_i32(e.raw_os_error().unwrap()) == Errno::EOVERFLOW {
+ // Skip tests on certain Linux kernels which have a bug
+ // regarding tmpfs in namespaces.
+ // Ubuntu 14.04 and 16.04 are known to be affected; 16.10 is
+ // not. There is no legitimate reason for open(2) to return
+ // EOVERFLOW here.
+ // https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1659087
+ let stderr = io::stderr();
+ let mut handle = stderr.lock();
+ writeln!(handle, "Buggy Linux kernel detected. Skipping test.")
+ .unwrap();
+ process::exit(0);
+ } else {
+ panic!("open failed: {}", e);
+ }
+ )
.and_then(|mut f| f.write(SCRIPT_CONTENTS))
.unwrap_or_else(|e| panic!("write failed: {}", e));