mirror of
https://github.com/rust-lang/rust
synced 2024-10-19 06:54:02 +00:00
Preserve the Windows GetLastError
error in HandleOrInvalid
.
In the `TryFrom<HandleOrInvalid> for OwnedHandle` and `TryFrom<HandleOrNull> for OwnedHandle` implemenations, `forget` the owned handle on the error path, to avoid calling `CloseHandle` on an invalid handle. It's harmless, except that it may overwrite the thread's `GetLastError` error.
This commit is contained in:
parent
c84f39e6c0
commit
95e1702284
|
@ -147,7 +147,15 @@ impl TryFrom<HandleOrNull> for OwnedHandle {
|
|||
#[inline]
|
||||
fn try_from(handle_or_null: HandleOrNull) -> Result<Self, ()> {
|
||||
let owned_handle = handle_or_null.0;
|
||||
if owned_handle.handle.is_null() { Err(()) } else { Ok(owned_handle) }
|
||||
if owned_handle.handle.is_null() {
|
||||
// Don't call `CloseHandle`; it'd be harmless, except that it could
|
||||
// overwrite the `GetLastError` error.
|
||||
forget(owned_handle);
|
||||
|
||||
Err(())
|
||||
} else {
|
||||
Ok(owned_handle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -197,7 +205,15 @@ impl TryFrom<HandleOrInvalid> for OwnedHandle {
|
|||
#[inline]
|
||||
fn try_from(handle_or_invalid: HandleOrInvalid) -> Result<Self, ()> {
|
||||
let owned_handle = handle_or_invalid.0;
|
||||
if owned_handle.handle == c::INVALID_HANDLE_VALUE { Err(()) } else { Ok(owned_handle) }
|
||||
if owned_handle.handle == c::INVALID_HANDLE_VALUE {
|
||||
// Don't call `CloseHandle`; it'd be harmless, except that it could
|
||||
// overwrite the `GetLastError` error.
|
||||
forget(owned_handle);
|
||||
|
||||
Err(())
|
||||
} else {
|
||||
Ok(owned_handle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue