Skip to content

Commit

Permalink
Win: Open dir for sync access in remove_dir_all
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisDenton committed Sep 3, 2024
1 parent c313c07 commit be2b964
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions std/src/sys/pal/windows/fs/remove_dir_all.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,12 @@ unsafe fn nt_open_file(
}

/// Open the file `path` in the directory `parent`, requesting the given `access` rights.
/// `options` will be OR'd with `FILE_OPEN_REPARSE_POINT`.
fn open_link_no_reparse(
parent: &File,
path: &[u16],
access: u32,
options: u32,
) -> Result<Option<File>, WinError> {
// This is implemented using the lower level `NtOpenFile` function as
// unfortunately opening a file relative to a parent is not supported by
Expand All @@ -96,7 +98,7 @@ fn open_link_no_reparse(
..c::OBJECT_ATTRIBUTES::default()
};
let share = c::FILE_SHARE_DELETE | c::FILE_SHARE_READ | c::FILE_SHARE_WRITE;
let options = c::FILE_OPEN_REPARSE_POINT;
let options = c::FILE_OPEN_REPARSE_POINT | options;
let result = nt_open_file(access, &object, share, options);

// Retry without OBJ_DONT_REPARSE if it's not supported.
Expand Down Expand Up @@ -128,13 +130,20 @@ fn open_link_no_reparse(
}

fn open_dir(parent: &File, name: &[u16]) -> Result<Option<File>, WinError> {
open_link_no_reparse(parent, name, c::SYNCHRONIZE | c::FILE_LIST_DIRECTORY)
// Open the directory for synchronous directory listing.
open_link_no_reparse(
parent,
name,
c::SYNCHRONIZE | c::FILE_LIST_DIRECTORY,
// "_IO_NONALERT" means that a synchronous call won't be interrupted.
c::FILE_SYNCHRONOUS_IO_NONALERT,
)
}

fn delete(parent: &File, name: &[u16]) -> Result<(), WinError> {
// Note that the `delete` function consumes the opened file to ensure it's
// dropped immediately. See module comments for why this is important.
match open_link_no_reparse(parent, name, c::SYNCHRONIZE | c::DELETE) {
match open_link_no_reparse(parent, name, c::DELETE, 0) {
Ok(Some(f)) => f.delete(),
Ok(None) => Ok(()),
Err(e) => Err(e),
Expand Down

0 comments on commit be2b964

Please sign in to comment.