Skip to content

Commit

Permalink
More robust extension checking
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisDenton authored and pietroalbini committed Sep 3, 2024
1 parent c313c07 commit fee6300
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 6 deletions.
2 changes: 1 addition & 1 deletion std/src/sys/pal/windows/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::time::Duration;
#[macro_use]
pub mod compat;

mod api;
pub mod api;

pub mod args;
pub mod c;
Expand Down
23 changes: 18 additions & 5 deletions std/src/sys/pal/windows/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,11 +272,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()?,
Expand Down
5 changes: 5 additions & 0 deletions std/src/sys/path/windows.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::ffi::{OsStr, OsString};
use crate::path::{Path, PathBuf, Prefix};
use crate::sys::api::utf16;
use crate::sys::pal::{c, fill_utf16_buf, os2path, to_u16s};
use crate::{io, ptr};

Expand All @@ -19,6 +20,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)
Expand Down

0 comments on commit fee6300

Please sign in to comment.