diff options
| author | bors <bors@rust-lang.org> | 2024-09-04 15:07:06 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-09-04 15:07:06 +0000 |
| commit | eeb90cda1969383f56a2637cbd3037bdf598841c (patch) | |
| tree | 54fd52367088ebbf0c73f13e278d8047fb723aba /library | |
| parent | f54dd915b0a4345ee06fd561416ad1af08b54dbb (diff) | |
| parent | b666f820546ad2fd15b591acc8dfd7e7f461147e (diff) | |
| download | rust-1.81.0.tar.gz rust-1.81.0.zip | |
Auto merge of #129960 - pietroalbini:pa-cve-2024-43402, r=pietroalbini 1.81.0
[stable] Fix CVE-2024-43402 Backport the fix for CVE-2024-43402 in the upcoming 1.81.0. See https://github.com/rust-lang/rust/security/advisories/GHSA-2xg3-7mm6-98jj for more information about it. This also includes https://github.com/rust-lang/rust/pull/129944 as a last-minute fix to the relnotes. cc `@boxyuwu` as you are driving this release r? `@ghost`
Diffstat (limited to 'library')
| -rw-r--r-- | library/std/src/sys/pal/windows/mod.rs | 2 | ||||
| -rw-r--r-- | library/std/src/sys/pal/windows/process.rs | 23 | ||||
| -rw-r--r-- | library/std/src/sys/path/windows.rs | 5 |
3 files changed, 24 insertions, 6 deletions
diff --git a/library/std/src/sys/pal/windows/mod.rs b/library/std/src/sys/pal/windows/mod.rs index b85a8318bcb..aab36f53612 100644 --- a/library/std/src/sys/pal/windows/mod.rs +++ b/library/std/src/sys/pal/windows/mod.rs @@ -14,7 +14,7 @@ pub use self::rand::hashmap_random_keys; #[macro_use] pub mod compat; -mod api; +pub mod api; pub mod alloc; pub mod args; diff --git a/library/std/src/sys/pal/windows/process.rs b/library/std/src/sys/pal/windows/process.rs index 76d2cb77d47..c816cb81097 100644 --- a/library/std/src/sys/pal/windows/process.rs +++ b/library/std/src/sys/pal/windows/process.rs @@ -279,11 +279,24 @@ impl Command { None }; let program = resolve_exe(&self.program, || env::var_os("PATH"), child_paths)?; - // Case insensitive "ends_with" of UTF-16 encoded ".bat" or ".cmd" - let is_batch_file = matches!( - program.len().checked_sub(5).and_then(|i| program.get(i..)), - Some([46, 98 | 66, 97 | 65, 116 | 84, 0] | [46, 99 | 67, 109 | 77, 100 | 68, 0]) - ); + let has_bat_extension = |program: &[u16]| { + matches!( + // Case insensitive "ends_with" of UTF-16 encoded ".bat" or ".cmd" + program.len().checked_sub(4).and_then(|i| program.get(i..)), + Some([46, 98 | 66, 97 | 65, 116 | 84] | [46, 99 | 67, 109 | 77, 100 | 68]) + ) + }; + let is_batch_file = if path::is_verbatim(&program) { + has_bat_extension(&program[..program.len() - 1]) + } else { + super::fill_utf16_buf( + |buffer, size| unsafe { + // resolve the path so we can test the final file name. + c::GetFullPathNameW(program.as_ptr(), size, buffer, ptr::null_mut()) + }, + |program| has_bat_extension(program), + )? + }; let (program, mut cmd_str) = if is_batch_file { ( command_prompt()?, diff --git a/library/std/src/sys/path/windows.rs b/library/std/src/sys/path/windows.rs index cebc7910231..abba705b64f 100644 --- a/library/std/src/sys/path/windows.rs +++ b/library/std/src/sys/path/windows.rs @@ -2,6 +2,7 @@ use crate::ffi::{OsStr, OsString}; use crate::io; use crate::path::{Path, PathBuf, Prefix}; use crate::ptr; +use crate::sys::api::utf16; use crate::sys::pal::{c, fill_utf16_buf, os2path, to_u16s}; #[cfg(test)] @@ -20,6 +21,10 @@ pub fn is_verbatim_sep(b: u8) -> bool { b == b'\\' } +pub fn is_verbatim(path: &[u16]) -> bool { + path.starts_with(utf16!(r"\\?\")) || path.starts_with(utf16!(r"\??\")) +} + /// Returns true if `path` looks like a lone filename. pub(crate) fn is_file_name(path: &OsStr) -> bool { !path.as_encoded_bytes().iter().copied().any(is_sep_byte) |
