From 9f7f681e26887a9b284a2f25e8252c3a5077f348 Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Wed, 8 May 2024 14:39:06 -0600 Subject: fix(runtime): allow nul device on windows (#23741) Fixes [23721](https://github.com/denoland/deno/issues/23721) --- ext/fs/std_fs.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'ext') diff --git a/ext/fs/std_fs.rs b/ext/fs/std_fs.rs index 6bc15a72d..9e2acedcc 100644 --- a/ext/fs/std_fs.rs +++ b/ext/fs/std_fs.rs @@ -890,7 +890,15 @@ fn open_with_access_check( access_check: Option, ) -> FsResult { if let Some(access_check) = access_check { - let path = if path.is_absolute() { + let path_bytes = path.as_os_str().as_encoded_bytes(); + let is_windows_device_path = cfg!(windows) + && path_bytes.starts_with(br"\\.\") + && !path_bytes.contains(&b':'); + let path = if is_windows_device_path { + // On Windows, normalize_path doesn't work with device-prefix-style + // paths. We pass these through. + path.to_owned() + } else if path.is_absolute() { normalize_path(path) } else { let cwd = current_dir()?; @@ -898,8 +906,8 @@ fn open_with_access_check( }; (*access_check)(false, &path, &options)?; // On Linux, /proc may contain magic links that we don't want to resolve - let needs_canonicalization = - !cfg!(target_os = "linux") || path.starts_with("/proc"); + let needs_canonicalization = !is_windows_device_path + && (!cfg!(target_os = "linux") || path.starts_with("/proc")); let path = if needs_canonicalization { match path.canonicalize() { Ok(path) => path, @@ -916,7 +924,6 @@ fn open_with_access_check( } else { path }; - (*access_check)(true, &path, &options)?; // For windows -- cgit v1.2.3