]> Cypherpunks repositories - gostls13.git/commitdiff
os: avoid finalizer race in windows process object
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 25 May 2021 14:24:41 +0000 (16:24 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Fri, 4 Jun 2021 17:21:49 +0000 (17:21 +0000)
If proc.Release is called concurrently, a handle will be double-freed.

Change-Id: I0c0c32e312e07bc8615e0bf9e9b691214444d8d5
Reviewed-on: https://go-review.googlesource.com/c/go/+/322510
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/os/exec_windows.go

index b59a01a75e93d11550715967071ec1696ae6e798..239bed198f7fd020f25de0d3f240d1ed7428d1ef 100644 (file)
@@ -69,7 +69,7 @@ func (p *Process) signal(sig Signal) error {
 }
 
 func (p *Process) release() error {
-       handle := atomic.LoadUintptr(&p.handle)
+       handle := atomic.SwapUintptr(&p.handle, uintptr(syscall.InvalidHandle))
        if handle == uintptr(syscall.InvalidHandle) {
                return syscall.EINVAL
        }
@@ -77,7 +77,6 @@ func (p *Process) release() error {
        if e != nil {
                return NewSyscallError("CloseHandle", e)
        }
-       atomic.StoreUintptr(&p.handle, uintptr(syscall.InvalidHandle))
        // no need for a finalizer anymore
        runtime.SetFinalizer(p, nil)
        return nil