diff options
| author | Dan Gohman <dev@sunfishcode.online> | 2022-03-20 15:37:31 -0700 |
|---|---|---|
| committer | Dan Gohman <dev@sunfishcode.online> | 2022-03-20 15:37:31 -0700 |
| commit | 95e170228440011bc6ac2eb5c689eda2f75ac586 (patch) | |
| tree | df7e301abf4f6806f434b3117906cd7bcff2ed9d | |
| parent | c84f39e6c08397d4ab9b51b472002a8bfc3b5b59 (diff) | |
| download | rust-95e170228440011bc6ac2eb5c689eda2f75ac586.tar.gz rust-95e170228440011bc6ac2eb5c689eda2f75ac586.zip | |
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.
| -rw-r--r-- | library/std/src/os/windows/io/handle.rs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/library/std/src/os/windows/io/handle.rs b/library/std/src/os/windows/io/handle.rs index be2ccbd98e9..120af9f99dd 100644 --- a/library/std/src/os/windows/io/handle.rs +++ b/library/std/src/os/windows/io/handle.rs @@ -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) + } } } |
