mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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>
This commit is contained in:
parent
105c5b50e0
commit
3a9d906edc
1 changed files with 1 additions and 2 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue