diff options
| author | Chris Denton <chris@chrisdenton.dev> | 2024-09-03 16:27:46 +0000 |
|---|---|---|
| committer | Chris Denton <chris@chrisdenton.dev> | 2024-09-03 16:27:46 +0000 |
| commit | 6b0fc97c7ab25b50c5b061cbe8ec4aaa5575e9f9 (patch) | |
| tree | 7505ff9aac68af07db01d7508be824327bd7b9fa | |
| parent | d6c8169c186ab16a3404cd0d0866674018e8a19e (diff) | |
| download | rust-6b0fc97c7ab25b50c5b061cbe8ec4aaa5575e9f9.tar.gz rust-6b0fc97c7ab25b50c5b061cbe8ec4aaa5575e9f9.zip | |
Win: Open dir for sync access in remove_dir_all
| -rw-r--r-- | library/std/src/sys/pal/windows/fs/remove_dir_all.rs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/library/std/src/sys/pal/windows/fs/remove_dir_all.rs b/library/std/src/sys/pal/windows/fs/remove_dir_all.rs index e7234ed8e5f..9416049da78 100644 --- a/library/std/src/sys/pal/windows/fs/remove_dir_all.rs +++ b/library/std/src/sys/pal/windows/fs/remove_dir_all.rs @@ -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 @@ -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. @@ -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), |
