Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixup Windows verbatim paths when used with the include! macro #125205

Merged
merged 1 commit into from
Oct 22, 2024

Conversation

ChrisDenton
Copy link
Member

On Windows, the following code can fail if the OUT_DIR environment variable is a verbatim path (i.e. begins with \\?\):

include!(concat!(env!("OUT_DIR"), "/src/repro.rs"));

This is because verbatim paths treat / literally, as if it were just another character in the file name.

The good news is that the standard library already has code to fix this. We can simply use components to normalize the path so it works as intended.

@rustbot
Copy link
Collaborator

rustbot commented May 17, 2024

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels May 17, 2024
@rustbot
Copy link
Collaborator

rustbot commented May 17, 2024

Some changes occurred in run-make tests.

cc @jieyouxu

@ChrisDenton ChrisDenton added the T-lang Relevant to the language team, which will review and decide on the PR/issue. label May 17, 2024
@rust-log-analyzer

This comment has been minimized.

@ChrisDenton
Copy link
Member Author

While I'd very much welcome a review from jieyouxu, this will need lang approval. I think it could just be considered a bug fix but it might also be considered a change in language.

cc @joshtriplett maybe?

@Noratrieb
Copy link
Member

Given that I see most projects already using / as the separator, calling it a bug fix seems fair. Still, I agree that lang should see it.

@jieyouxu
Copy link
Member

Changes look reasonable from compiler side. Rolling a lang reviewer to decide if this behavior change is acceptable.

r? lang

@rustbot rustbot assigned joshtriplett and unassigned jieyouxu May 17, 2024
@ChrisDenton ChrisDenton added S-waiting-on-team Status: Awaiting decision from the relevant subteam (see the T-<team> label). and removed T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels May 22, 2024
@workingjubilee workingjubilee added the I-lang-nominated Nominated for discussion during a lang team meeting. label Jul 15, 2024
@bors
Copy link
Contributor

bors commented Jul 29, 2024

☔ The latest upstream changes (presumably #125443) made this pull request unmergeable. Please resolve the merge conflicts.

@rustbot rustbot added the A-run-make Area: port run-make Makefiles to rmake.rs label Jul 31, 2024
@rust-log-analyzer

This comment has been minimized.

When using `concat!` to join paths, the Unix path separator (`/`) is often used. This breaks on Windows if the base path is a verbatim path (i.e. starts with `\\?\`).
@traviscross traviscross added the I-lang-easy-decision Issue: The decision needed by the team is conjectured to be easy. label Sep 25, 2024
@joshtriplett
Copy link
Member

It looks like this is limited to verbatim paths, which seems completely safe. This wouldn't be safe to do for arbitrary Windows driver-interpreted paths, but it seems entirely safe for Windows verbatim paths.

@joshtriplett joshtriplett removed the I-lang-easy-decision Issue: The decision needed by the team is conjectured to be easy. label Sep 25, 2024
@ChrisDenton
Copy link
Member Author

ChrisDenton commented Sep 25, 2024

Thanks! So I'm going to go out on a limb and say jieyouxu's positive review still stands.

@bors r=jieyouxu

@bors
Copy link
Contributor

bors commented Sep 25, 2024

📌 Commit edc97a0 has been approved by jieyouxu

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. S-waiting-on-team Status: Awaiting decision from the relevant subteam (see the T-<team> label). labels Sep 25, 2024
@ChrisDenton
Copy link
Member Author

What happens if you use a bad verbatim path in a path attribute today? Should probably be consistent?

I mean you can't use concat in path, right?

@traviscross
Copy link
Contributor

@rustbot labels -I-lang-easy-decision

This one turned out to not be an easy call for us. One question that came up is:

@ChrisDenton: Is there any way that someone could have used the behavior that exists today correctly with forward slashes in the string? I.e., is there any plausibly valid use case that we might be breaking?

(h/t @tmandry)

@ChrisDenton
Copy link
Member Author

Is there any way that someone could have used the behavior that exists today correctly with forward slashes in the string? I.e., is there any plausibly valid use case that we might be breaking?

I cannot think of one. I can think of an implausible scenario. Like someone could create a named pipe, containing / in the name (which is technically allowed but very hard to do normally) then they intentionally use a verbatim prefix so they can access it.

@ChrisDenton
Copy link
Member Author

But I would note that if they're doing something that's not only platform specific but requires a fair amount of hacks (and would break when using normal \\.\PIPE paths).

The scenario for supporting this is a lot more plausible: someone sets an environment variable in a build script using Path::canonicalize (which makes verbatim paths on Windows). Then they do the common concat thing expecting it to work cross-platform.

@traviscross
Copy link
Contributor

@rfcbot reviewed

Based on the responses here, what's proposed seems like at least the best worst option.

@nikomatsakis
Copy link
Contributor

@rfcbot reviewed

1 similar comment
@tmandry
Copy link
Member

tmandry commented Oct 2, 2024

@rfcbot reviewed

@scottmcm
Copy link
Member

scottmcm commented Oct 2, 2024

I mean you can't use concat in path, right?

This isn't concat-specific though, because it'll change if you put a string literal in the include too.

I just think that we should do it for all compiler paths if we're doing it here.

@rfcbot rfcbot added final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. and removed proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. labels Oct 2, 2024
@rfcbot
Copy link

rfcbot commented Oct 2, 2024

🔔 This is now entering its final comment period, as per the review above. 🔔

@traviscross
Copy link
Contributor

@rustbot labels -I-lang-nominated

We discussed this in the meeting today... and it's now in FCP.

@rustbot rustbot removed the I-lang-nominated Nominated for discussion during a lang team meeting. label Oct 2, 2024
@rfcbot rfcbot added finished-final-comment-period The final comment period is finished for this PR / Issue. to-announce Announce this issue on triage meeting and removed final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. labels Oct 12, 2024
@rfcbot
Copy link

rfcbot commented Oct 12, 2024

The final comment period, with a disposition to merge, as per the review above, is now complete.

As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.

This will be merged soon.

@ChrisDenton
Copy link
Member Author

I mean you can't use concat in path, right?

This isn't concat-specific though, because it'll change if you put a string literal in the include too.

I just think that we should do it for all compiler paths if we're doing it here.

Oh, it turns out we do something kind of similar for path already:

// On windows, the base path might have the form
// `\\?\foo\bar` in which case it does not tolerate
// mixed `/` and `\` separators, so canonicalize
// `/` to `\`.
#[cfg(windows)]
let path_str = path_str.replace("/", "\\");

@ChrisDenton
Copy link
Member Author

This has passed lang FCP and was earlier approved by @jieyouxu so I'll merge this now. I'll look more at #[path] but it already looks like it does the equivalent by virtue of using Path::join (which handles verbatim paths).

Some(dir_path.join(path_str))

@bors r=jieyouxu

@bors
Copy link
Contributor

bors commented Oct 22, 2024

📌 Commit edc97a0 has been approved by jieyouxu

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Oct 22, 2024
bors added a commit to rust-lang-ci/rust that referenced this pull request Oct 22, 2024
…iaskrgr

Rollup of 8 pull requests

Successful merges:

 - rust-lang#125205 (Fixup Windows verbatim paths when used with the `include!` macro)
 - rust-lang#131049 (Validate args are correct for `UnevaluatedConst`, `ExistentialTraitRef`/`ExistentialProjection`)
 - rust-lang#131549 (Add a note for `?` on a `impl Future<Output = Result<..>>` in sync function)
 - rust-lang#131731 (add `TestFloatParse` to `tools.rs` for bootstrap)
 - rust-lang#131732 (Add doc(plugins), doc(passes), etc. to INVALID_DOC_ATTRIBUTES)
 - rust-lang#132006 (don't stage-off to previous compiler when CI rustc is available)
 - rust-lang#132022 (Move `cmp_in_dominator_order` out of graph dominator computation)
 - rust-lang#132033 (compiletest: Make `line_directive` return a `DirectiveLine`)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 4d378f2 into rust-lang:master Oct 22, 2024
6 checks passed
@rustbot rustbot added this to the 1.84.0 milestone Oct 22, 2024
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Oct 22, 2024
Rollup merge of rust-lang#125205 - ChrisDenton:verbatim-include, r=jieyouxu

Fixup Windows verbatim paths when used with the `include!` macro

On Windows, the following code can fail if the `OUT_DIR` environment variable is a [verbatim path](https://doc.rust-lang.org/std/path/enum.Prefix.html) (i.e. begins with `\\?\`):

```rust
include!(concat!(env!("OUT_DIR"), "/src/repro.rs"));
```

This is because verbatim paths treat `/` literally, as if it were just another character in the file name.

The good news is that the standard library already has code to fix this. We can simply use `components` to normalize the path so it works as intended.
@ChrisDenton ChrisDenton deleted the verbatim-include branch November 7, 2024 15:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-run-make Area: port run-make Makefiles to rmake.rs disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-lang Relevant to the language team, which will review and decide on the PR/issue. to-announce Announce this issue on triage meeting
Projects
None yet
Development

Successfully merging this pull request may close these issues.