Skip to content

Commit

Permalink
Unrolled build for rust-lang#137482
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#137482 - rust9x:win-file-open-truncate, r=ChrisDenton

Windows: use existing wrappers in `File::open_native`

Just a small improvement I've noticed - prevents accidents regarding `SetFileInformationByHandle` parameters.

Probably ``@ChrisDenton`` since we talked about it on discord :)
  • Loading branch information
rust-timer authored Feb 24, 2025
2 parents f43e549 + 87c0380 commit 6af662e
Showing 1 changed file with 11 additions and 25 deletions.
36 changes: 11 additions & 25 deletions library/std/src/sys/pal/windows/fs.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use super::api::{self, WinError};
use super::api::{self, WinError, set_file_information_by_handle};
use super::{IoResult, to_u16s};
use crate::alloc::{alloc, handle_alloc_error};
use crate::borrow::Cow;
Expand Down Expand Up @@ -319,31 +319,17 @@ impl File {
&& creation == c::OPEN_ALWAYS
&& api::get_last_error() == WinError::ALREADY_EXISTS
{
unsafe {
// This first tries `FileAllocationInfo` but falls back to
// `FileEndOfFileInfo` in order to support WINE.
// If WINE gains support for FileAllocationInfo, we should
// remove the fallback.
let alloc = c::FILE_ALLOCATION_INFO { AllocationSize: 0 };
let result = c::SetFileInformationByHandle(
handle.as_raw_handle(),
c::FileAllocationInfo,
(&raw const alloc).cast::<c_void>(),
mem::size_of::<c::FILE_ALLOCATION_INFO>() as u32,
);
if result == 0 {
// This first tries `FileAllocationInfo` but falls back to
// `FileEndOfFileInfo` in order to support WINE.
// If WINE gains support for FileAllocationInfo, we should
// remove the fallback.
let alloc = c::FILE_ALLOCATION_INFO { AllocationSize: 0 };
set_file_information_by_handle(handle.as_raw_handle(), &alloc)
.or_else(|_| {
let eof = c::FILE_END_OF_FILE_INFO { EndOfFile: 0 };
let result = c::SetFileInformationByHandle(
handle.as_raw_handle(),
c::FileEndOfFileInfo,
(&raw const eof).cast::<c_void>(),
mem::size_of::<c::FILE_END_OF_FILE_INFO>() as u32,
);
if result == 0 {
return Err(io::Error::last_os_error());
}
}
}
set_file_information_by_handle(handle.as_raw_handle(), &eof)
})
.io_result()?;
}
Ok(File { handle: Handle::from_inner(handle) })
} else {
Expand Down

0 comments on commit 6af662e

Please sign in to comment.