Skip to content

Win32 Alternate data streams don't work with Command in Rust 1.58.0 #93772

@roblabla

Description

@roblabla
Contributor

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

added
C-bugCategory: This is a bug.
regression-untriagedUntriaged performance or correctness regression.
on Feb 8, 2022
added
regression-from-stable-to-stablePerformance or correctness regression from one stable version to another.
I-prioritizeIssue: Indicates that prioritization has been requested for this issue.
and removed
regression-untriagedUntriaged performance or correctness regression.
on Feb 8, 2022
Urgau

Urgau commented on Feb 8, 2022

@Urgau
Member

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

ChrisDenton commented on Feb 8, 2022

@ChrisDenton
Member

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

roblabla commented on Feb 8, 2022

@roblabla
ContributorAuthor

Ah, you're correct. Using .\ works. Thanks for the help!

removed
regression-from-stable-to-stablePerformance or correctness regression from one stable version to another.
I-prioritizeIssue: Indicates that prioritization has been requested for this issue.
C-bugCategory: This is a bug.
on Feb 8, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @roblabla@Urgau@ChrisDenton@apiraino@rustbot

        Issue actions

          Win32 Alternate data streams don't work with Command in Rust 1.58.0 · Issue #93772 · rust-lang/rust