Skip to content

Commit 65d14d2

Browse files
committed
Rollup merge of rust-lang#21498 - quantheory:master, r=alexcrichton
While trying to experiment with changes for some other issues, I noticed that the test for rust-lang#15149 was failing because I have `/tmp` mounted as `noexec` on my Linux box, and that test tries to run out of a temporary directory. This may not be the most common case, but it's not rare by any means, because executing from a world-writable directory is a security problem. (For this reason, some kernel options/mods such as grsecurity also can prevent this on Linux.) I instead copy the executable to a directory created in the build tree, following the example of the `process-spawn-with-unicode-params` test. After I made that change, I noticed that I'd made a mistake, but the test was still passing, because the "parent" process was not actually checking the status of the "child" process, meaning that the assertion in the child could never cause the overall test to fail. (I don't know if this has always been the case, or if it has something to do with either Windows or a change in the semantics of `spawn`.) So I fixed the test so that it would fail correctly, then fixed my original mistake so that it would pass again. The one big problem with this is that I haven't set up any machines of my own so that I can build on Windows, which is the platform this test was targeted at in the first place! That might take a while to address on my end. So I need someone else to check this on Windows.
2 parents 6a9ee09 + 7f45dc9 commit 65d14d2

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

src/test/run-pass/issue-15149.rs

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,50 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use std::io::{TempDir, Command, fs};
11+
use std::io::{Command, fs, USER_RWX};
1212
use std::os;
13+
use std::path::BytesContainer;
14+
use std::rand::random;
1315

1416
fn main() {
1517
// If we're the child, make sure we were invoked correctly
1618
let args = os::args();
1719
if args.len() > 1 && args[1].as_slice() == "child" {
18-
return assert_eq!(args[0].as_slice(), "mytest");
20+
return assert_eq!(args[0],
21+
format!("mytest{}", os::consts::EXE_SUFFIX));
1922
}
2023

2124
test();
2225
}
2326

2427
fn test() {
25-
// If we're the parent, copy our own binary to a tempr directory, and then
26-
// make it executable.
27-
let dir = TempDir::new("mytest").unwrap();
28-
let me = os::self_exe_name().unwrap();
29-
let dest = dir.path().join(format!("mytest{}", os::consts::EXE_SUFFIX));
30-
fs::copy(&me, &dest).unwrap();
31-
32-
// Append the temp directory to our own PATH.
28+
// If we're the parent, copy our own binary to a new directory.
29+
let my_path = os::self_exe_name().unwrap();
30+
let my_dir = my_path.dir_path();
31+
32+
let random_u32: u32 = random();
33+
let child_dir = Path::new(my_dir.join(format!("issue-15149-child-{}",
34+
random_u32)));
35+
fs::mkdir(&child_dir, USER_RWX).unwrap();
36+
37+
let child_path = child_dir.join(format!("mytest{}",
38+
os::consts::EXE_SUFFIX));
39+
fs::copy(&my_path, &child_path).unwrap();
40+
41+
// Append the new directory to our own PATH.
3342
let mut path = os::split_paths(os::getenv("PATH").unwrap_or(String::new()));
34-
path.push(dir.path().clone());
43+
path.push(child_dir.clone());
3544
let path = os::join_paths(path.as_slice()).unwrap();
3645

37-
Command::new("mytest").env("PATH", path.as_slice())
38-
.arg("child")
39-
.spawn().unwrap();
46+
let child_output = Command::new("mytest").env("PATH", path.as_slice())
47+
.arg("child")
48+
.output().unwrap();
49+
50+
assert!(child_output.status.success(),
51+
format!("child assertion failed\n child stdout:\n {}\n child stderr:\n {}",
52+
child_output.output.container_as_str().unwrap(),
53+
child_output.error.container_as_str().unwrap()));
54+
55+
fs::rmdir_recursive(&child_dir).unwrap();
56+
4057
}

0 commit comments

Comments
 (0)