rust/src
bors c4df63f47f Auto merge of #80537 - ehuss:macos-posix-spawn-chdir, r=dtolnay
Don't use posix_spawn_file_actions_addchdir_np on macOS.

There is a bug on macOS where using `posix_spawn_file_actions_addchdir_np` with a relative executable path will cause `posix_spawnp` to return ENOENT, even though it successfully spawned the process in the given directory.

`posix_spawn_file_actions_addchdir_np` was introduced in macOS 10.15 first released in Oct 2019.  I have tested macOS 10.15.7 and 11.0.1.

Example offending program:

```rust
use std::fs;
use std::os::unix::fs::PermissionsExt;
use std::process::*;

fn main() {
    fs::create_dir_all("bar").unwrap();
    fs::create_dir_all("foo").unwrap();
    fs::write("foo/foo.sh", "#!/bin/sh\necho hello ${PWD}\n").unwrap();
    let perms = fs::Permissions::from_mode(0o755);
    fs::set_permissions("foo/foo.sh", perms).unwrap();
    let c = Command::new("../foo/foo.sh").current_dir("bar").spawn();
    eprintln!("{:?}", c);
}
```

This prints:

```
Err(Os { code: 2, kind: NotFound, message: "No such file or directory" })
hello /Users/eric/Temp/bar
```

I wanted to open this PR to get some feedback on possible solutions.  Alternatives:
* Do nothing.
* Document the bug.
* Try to detect if the executable is a relative path on macOS, and avoid using `posix_spawn_file_actions_addchdir_np` only in that case.

I looked at the [XNU source code](https://opensource.apple.com/source/xnu/xnu-6153.141.1/bsd/kern/kern_exec.c.auto.html), but I didn't see anything obvious that would explain the behavior.  The actual chdir succeeds, it is something else further down that fails, but I couldn't see where.

EDIT: I forgot to mention, relative exe paths with `current_dir` in general are discouraged (see #37868).  I don't know if #37868 is fixable, since normalizing it would change the semantics for some platforms. Another option is to convert the executable to an absolute path with something like joining the cwd with the new cwd and the executable, but I'm uncertain about that.
2021-01-17 23:44:46 +00:00
..
bootstrap Rollup merge of #81064 - Mark-Simulacrum:support-stage1-check, r=jyn514 2021-01-17 12:24:53 +00:00
build_helper Fix even more URLs 2020-11-05 20:11:29 +01:00
ci Auto merge of #80435 - pietroalbini:compression-formats, r=Mark-Simulacrum 2020-12-31 00:23:13 +00:00
doc Rollup merge of #80973 - ehuss:update-books, r=ehuss 2021-01-14 18:00:20 +00:00
etc Detect invalid rustdoc test commands 2021-01-03 13:53:11 +01:00
librustdoc Auto merge of #80679 - jackh726:predicate-kind-take2, r=lcnr 2021-01-17 20:49:11 +00:00
llvm-project@f9a8d70b6e Update to LLVM 11.0.1 2021-01-07 11:32:10 -08:00
test Auto merge of #80537 - ehuss:macos-posix-spawn-chdir, r=dtolnay 2021-01-17 23:44:46 +00:00
tools Auto merge of #80679 - jackh726:predicate-kind-take2, r=lcnr 2021-01-17 20:49:11 +00:00
README.md
stage0.txt Bump bootstrap compiler to 1.50 beta 2020-12-30 09:27:19 -05:00
version Bump version to 1.51 2020-12-25 10:42:53 -05:00

This directory contains the source code of the rust project, including:

  • The test suite
  • The bootstrapping build system
  • Various submodules for tools, like rustdoc, rls, etc.

For more information on how various parts of the compiler work, see the rustc dev guide.