diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2019-06-27 06:38:57 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2019-06-27 07:54:53 -0700 |
| commit | 2a375827ab56900bf550161ee08ada664e68b267 (patch) | |
| tree | b46f047af30d2245f4be11b649166b44f7a98a9b | |
| parent | a6b5d229c1ddd7659af82109377aa8a3568f68a1 (diff) | |
| download | rust-2a375827ab56900bf550161ee08ada664e68b267.tar.gz rust-2a375827ab56900bf550161ee08ada664e68b267.zip | |
std: Move a process test out of libstd
This commit moves a test out of libstd which is causing deadlocks on musl on CI. Looks like the recent update in musl versions brings in some internal updates to musl which makes `setgid` and `setuid` invalid to call after a `fork` in a multithreaded program. The issue seen here is that the child thread was attempting to grab a lock held by a nonexistent thread, meaning that the child process simply deadlocked causing the whole test to deadlock. This commit moves the test to its own file with no threads which should work.
| -rw-r--r-- | src/libstd/process.rs | 27 | ||||
| -rw-r--r-- | src/test/run-pass/command-uid-gid.rs | 26 |
2 files changed, 26 insertions, 27 deletions
diff --git a/src/libstd/process.rs b/src/libstd/process.rs index a568f466637..000f80f99e7 100644 --- a/src/libstd/process.rs +++ b/src/libstd/process.rs @@ -1765,33 +1765,6 @@ mod tests { assert_eq!(out, "foobar\n"); } - - #[test] - #[cfg_attr(target_os = "android", ignore)] - #[cfg(unix)] - fn uid_works() { - use crate::os::unix::prelude::*; - - let mut p = Command::new("/bin/sh") - .arg("-c").arg("true") - .uid(unsafe { libc::getuid() }) - .gid(unsafe { libc::getgid() }) - .spawn().unwrap(); - assert!(p.wait().unwrap().success()); - } - - #[test] - #[cfg_attr(target_os = "android", ignore)] - #[cfg(unix)] - fn uid_to_root_fails() { - use crate::os::unix::prelude::*; - - // if we're already root, this isn't a valid test. Most of the bots run - // as non-root though (android is an exception). - if unsafe { libc::getuid() == 0 } { return } - assert!(Command::new("/bin/ls").uid(0).gid(0).spawn().is_err()); - } - #[test] #[cfg_attr(target_os = "android", ignore)] fn test_process_status() { diff --git a/src/test/run-pass/command-uid-gid.rs b/src/test/run-pass/command-uid-gid.rs new file mode 100644 index 00000000000..2b52c5d104c --- /dev/null +++ b/src/test/run-pass/command-uid-gid.rs @@ -0,0 +1,26 @@ +#![feature(rustc_private)] + +fn main() { + #[cfg(unix)] + run() +} + +#[cfg(unix)] +fn run() { + extern crate libc; + use std::process::Command; + use std::os::unix::prelude::*; + + let mut p = Command::new("/bin/sh") + .arg("-c").arg("true") + .uid(unsafe { libc::getuid() }) + .gid(unsafe { libc::getgid() }) + .spawn().unwrap(); + assert!(p.wait().unwrap().success()); + + // if we're already root, this isn't a valid test. Most of the bots run + // as non-root though (android is an exception). + if unsafe { libc::getuid() != 0 } { + assert!(Command::new("/bin/ls").uid(0).gid(0).spawn().is_err()); + } +} |
