mirror of
https://github.com/golang/go.git
synced 2025-11-10 13:41:05 +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
1 changed files with 13 additions and 3 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue