diff options
| author | Chris Denton <christophersdenton@gmail.com> | 2022-04-04 06:08:16 +0100 |
|---|---|---|
| committer | Chris Denton <christophersdenton@gmail.com> | 2022-04-05 08:17:47 +0100 |
| commit | 88c05edc9deb6def7ed4b1370cca6ddb79da8424 (patch) | |
| tree | a409921a8479b207b439b51a8d2da524e27f300e | |
| parent | 084b71a54ff86db4d220845e7a8847b9928f89cf (diff) | |
| download | rust-88c05edc9deb6def7ed4b1370cca6ddb79da8424.tar.gz rust-88c05edc9deb6def7ed4b1370cca6ddb79da8424.zip | |
Make `synchronous_write` safe to call
| -rw-r--r-- | library/std/src/sys/windows/c.rs | 7 | ||||
| -rw-r--r-- | library/std/src/sys/windows/handle.rs | 34 |
2 files changed, 18 insertions, 23 deletions
diff --git a/library/std/src/sys/windows/c.rs b/library/std/src/sys/windows/c.rs index 1528db7362e..336264d99f9 100644 --- a/library/std/src/sys/windows/c.rs +++ b/library/std/src/sys/windows/c.rs @@ -986,13 +986,6 @@ extern "system" { lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE, ) -> BOOL; - pub fn WriteFile( - hFile: BorrowedHandle<'_>, - lpBuffer: LPVOID, - nNumberOfBytesToWrite: DWORD, - lpNumberOfBytesWritten: LPDWORD, - lpOverlapped: LPOVERLAPPED, - ) -> BOOL; pub fn WriteFileEx( hFile: BorrowedHandle<'_>, lpBuffer: LPVOID, diff --git a/library/std/src/sys/windows/handle.rs b/library/std/src/sys/windows/handle.rs index c3e1b9587a4..2a0bffd6a8e 100644 --- a/library/std/src/sys/windows/handle.rs +++ b/library/std/src/sys/windows/handle.rs @@ -192,7 +192,7 @@ impl Handle { } pub fn write(&self, buf: &[u8]) -> io::Result<usize> { - unsafe { self.synchronous_write(&buf, None) } + self.synchronous_write(&buf, None) } pub fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result<usize> { @@ -205,7 +205,7 @@ impl Handle { } pub fn write_at(&self, buf: &[u8], offset: u64) -> io::Result<usize> { - unsafe { self.synchronous_write(&buf, Some(offset)) } + self.synchronous_write(&buf, Some(offset)) } pub fn try_clone(&self) -> io::Result<Self> { @@ -276,25 +276,27 @@ impl Handle { /// See #81357. /// /// If `offset` is `None` then the current file position is used. - unsafe fn synchronous_write(&self, buf: &[u8], offset: Option<u64>) -> io::Result<usize> { + fn synchronous_write(&self, buf: &[u8], offset: Option<u64>) -> io::Result<usize> { let mut io_status = c::IO_STATUS_BLOCK::default(); // The length is clamped at u32::MAX. let len = cmp::min(buf.len(), c::DWORD::MAX as usize) as c::DWORD; - let status = c::NtWriteFile( - self.as_handle(), - ptr::null_mut(), - None, - ptr::null_mut(), - &mut io_status, - buf.as_ptr(), - len, - offset.map(|n| n as _).as_ref(), - None, - ); + let status = unsafe { + c::NtWriteFile( + self.as_handle(), + ptr::null_mut(), + None, + ptr::null_mut(), + &mut io_status, + buf.as_ptr(), + len, + offset.map(|n| n as _).as_ref(), + None, + ) + }; match status { // If the operation has not completed then abort the process. - // Doing otherwise means that the buffer maybe read and the stack + // Doing otherwise means that the buffer may be read and the stack // written to after this function returns. c::STATUS_PENDING => { eprintln!("I/O error: operation failed to complete synchronously"); @@ -305,7 +307,7 @@ impl Handle { status if c::nt_success(status) => Ok(io_status.Information), status => { - let error = c::RtlNtStatusToDosError(status); + let error = unsafe { c::RtlNtStatusToDosError(status) }; Err(io::Error::from_raw_os_error(error as _)) } } |
