Narrow the scope of the ReadFile unsafe block

This commit is contained in:
Chris Denton 2024-07-17 05:53:20 +00:00
parent a33abbba98
commit 2043de12a3
No known key found for this signature in database
GPG key ID: 713472F2F45627DE

View file

@ -143,7 +143,7 @@ impl Handle {
) -> io::Result<Option<usize>> { ) -> io::Result<Option<usize>> {
// SAFETY: We have exclusive access to the buffer and it's up to the caller to // SAFETY: We have exclusive access to the buffer and it's up to the caller to
// ensure the OVERLAPPED pointer is valid for the lifetime of this function. // ensure the OVERLAPPED pointer is valid for the lifetime of this function.
unsafe { let (res, amt) = unsafe {
let len = cmp::min(buf.len(), u32::MAX as usize) as u32; let len = cmp::min(buf.len(), u32::MAX as usize) as u32;
let mut amt = 0; let mut amt = 0;
let res = cvt(c::ReadFile( let res = cvt(c::ReadFile(
@ -153,16 +153,17 @@ impl Handle {
&mut amt, &mut amt,
overlapped, overlapped,
)); ));
match res { (res, amt)
Ok(_) => Ok(Some(amt as usize)), };
Err(e) => { match res {
if e.raw_os_error() == Some(c::ERROR_IO_PENDING as i32) { Ok(_) => Ok(Some(amt as usize)),
Ok(None) Err(e) => {
} else if e.raw_os_error() == Some(c::ERROR_BROKEN_PIPE as i32) { if e.raw_os_error() == Some(c::ERROR_IO_PENDING as i32) {
Ok(Some(0)) Ok(None)
} else { } else if e.raw_os_error() == Some(c::ERROR_BROKEN_PIPE as i32) {
Err(e) Ok(Some(0))
} } else {
Err(e)
} }
} }
} }