runtime: detect errors in DuplicateHandle

These functions rely on DuplicateHandle succeeding, but they don't check
the return value, which might be masking subtle bugs that cause other
problems down the line.

Updates #43720.

Change-Id: I77f0e6645affa534777ffc173144a52e4afa5f81
Reviewed-on: https://go-review.googlesource.com/c/go/+/284135
Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Austin Clements <austin@google.com>
Trust: Alex Brainman <alex.brainman@gmail.com>
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2021-01-15 16:29:00 +01:00
parent 9f83418b83
commit 682a1d2176

View file

@ -893,7 +893,10 @@ func sigblock(exiting bool) {
// Called on the new thread, cannot allocate memory. // Called on the new thread, cannot allocate memory.
func minit() { func minit() {
var thandle uintptr var thandle uintptr
stdcall7(_DuplicateHandle, currentProcess, currentThread, currentProcess, uintptr(unsafe.Pointer(&thandle)), 0, 0, _DUPLICATE_SAME_ACCESS) if stdcall7(_DuplicateHandle, currentProcess, currentThread, currentProcess, uintptr(unsafe.Pointer(&thandle)), 0, 0, _DUPLICATE_SAME_ACCESS) == 0 {
print("runtime.minit: duplicatehandle failed; errno=", getlasterror(), "\n")
throw("runtime.minit: duplicatehandle failed")
}
// Configure usleep timer, if possible. // Configure usleep timer, if possible.
var timer uintptr var timer uintptr
@ -1134,8 +1137,12 @@ func profileloop1(param uintptr) uint32 {
} }
// Acquire our own handle to the thread. // Acquire our own handle to the thread.
var thread uintptr var thread uintptr
stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) if stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) == 0 {
print("runtime.profileloop1: duplicatehandle failed; errno=", getlasterror(), "\n")
throw("runtime.profileloop1: duplicatehandle failed")
}
unlock(&mp.threadLock) unlock(&mp.threadLock)
// mp may exit between the DuplicateHandle // mp may exit between the DuplicateHandle
// above and the SuspendThread. The handle // above and the SuspendThread. The handle
// will remain valid, but SuspendThread may // will remain valid, but SuspendThread may
@ -1214,7 +1221,10 @@ func preemptM(mp *m) {
return return
} }
var thread uintptr var thread uintptr
stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) if stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) == 0 {
print("runtime.preemptM: duplicatehandle failed; errno=", getlasterror(), "\n")
throw("runtime.preemptM: duplicatehandle failed")
}
unlock(&mp.threadLock) unlock(&mp.threadLock)
// Prepare thread context buffer. This must be aligned to 16 bytes. // Prepare thread context buffer. This must be aligned to 16 bytes.