-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Description
Since Rust 1.58, code using Command
to spawn new processes that live in an alternate data stream on Windows fails to work. Alternate Data Streams are files that have a :suffix
, such as filename.exe:alt
.
Code
This is the code that fails:
std::fs::File::create("test.txt").unwrap();
std::fs::copy(r"C:\Windows\System32\find.exe", "test.txt:lolexe").unwrap();
let _cmd = Command::new("test.txt:lolexe")
.status()
.unwrap();
I expected to see this happen: The command spawns properly and executes the find.exe code
Instead, this happened: The unwrap fails with
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { kind: NotFound, message: "program not found" }', altdatastreamprog/src/lib.rs:514:14
Version it worked on
It most recently worked on: Rust 1.57.x
Version with regression
rust 1.58.0
I believe the commit that broke it is d9a1f9a
@rustbot modify labels: +regression-from-stable-to-stable -regression-untriaged
Activity
Urgau commentedon Feb 8, 2022
I believe this is now the excepted behavior: Windows: Resolve process::Command program without using the current directory
I don't thing this has anything to do with Alternate Data Streams, but just the fact that the process is no longer resolved using the current working directory.
You could check if it works by making the executable explicitly relative by appending
.\
to your executable like this.\test.txt:lolexe
.cc @ChrisDenton
ChrisDenton commentedon Feb 8, 2022
Indeed. The release announcement for 1.58 gives the motivation for why the current directory is no longer used. In short, it was considered a security risk.
roblabla commentedon Feb 8, 2022
Ah, you're correct. Using
.\
works. Thanks for the help!