]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: detect errors in DuplicateHandle
authorJason A. Donenfeld <Jason@zx2c4.com>
Fri, 15 Jan 2021 15:29:00 +0000 (16:29 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Fri, 15 Jan 2021 23:38:58 +0000 (23:38 +0000)
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>

src/runtime/os_windows.go

index d389d38ab9cf0cb11d377a188ede27c40025f212..16ff285e88f4e22ed8f12dce4db0eef87c99b73d 100644 (file)
@@ -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.