aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-05-25 16:24:41 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-06-04 17:21:49 +0000
commit3a9d906edcfd0fa574ecd5498f8999b56f1e5fa1 (patch)
treec4c52069ca0c388ae04ea8e25b9e30a796a51843
parent105c5b50e0098720b9e24aea5efa8e161c31db6d (diff)
downloadgo-3a9d906edcfd0fa574ecd5498f8999b56f1e5fa1.tar.gz
go-3a9d906edcfd0fa574ecd5498f8999b56f1e5fa1.zip
os: avoid finalizer race in windows process object
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>
-rw-r--r--src/os/exec_windows.go3
1 files changed, 1 insertions, 2 deletions
diff --git a/src/os/exec_windows.go b/src/os/exec_windows.go
index b59a01a75e..239bed198f 100644
--- a/src/os/exec_windows.go
+++ b/src/os/exec_windows.go
@@ -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