mirror of
https://github.com/golang/go.git
synced 2024-09-21 10:28:27 +00:00
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:
parent
9f83418b83
commit
682a1d2176
@ -893,7 +893,10 @@ func sigblock(exiting bool) {
|
||||
// Called on the new thread, cannot allocate memory.
|
||||
func minit() {
|
||||
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.
|
||||
var timer uintptr
|
||||
@ -1134,8 +1137,12 @@ func profileloop1(param uintptr) uint32 {
|
||||
}
|
||||
// Acquire our own handle to the thread.
|
||||
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)
|
||||
|
||||
// mp may exit between the DuplicateHandle
|
||||
// above and the SuspendThread. The handle
|
||||
// will remain valid, but SuspendThread may
|
||||
@ -1214,7 +1221,10 @@ func preemptM(mp *m) {
|
||||
return
|
||||
}
|
||||
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)
|
||||
|
||||
// Prepare thread context buffer. This must be aligned to 16 bytes.
|
||||
|
Loading…
Reference in New Issue
Block a user