]> Cypherpunks repositories - gostls13.git/commit
cmd/compile: fix mishandling of unsafe-uintptr arguments in go/defer
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Tue, 8 Sep 2020 08:28:43 +0000 (15:28 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Wed, 9 Sep 2020 07:50:01 +0000 (07:50 +0000)
commitbdb480fd623e58d0d1d0689a3755367379ea57bc
tree4875cdbf806e7088be9a261cf61135bda02138e9
parent1e6ad65b43ee392676a69f769b1942edd8af0e86
cmd/compile: fix mishandling of unsafe-uintptr arguments in go/defer

Currently, the statement:

go g(uintptr(f()))

gets rewritten into:

tmp := f()
newproc(8, g, uintptr(tmp))
runtime.KeepAlive(tmp)

which doesn't guarantee that tmp is still alive by time the g call is
scheduled to run.

This CL fixes the issue, by wrapping g call in a closure:

go func(p unsafe.Pointer) {
g(uintptr(p))
}(f())

then this will be rewritten into:

tmp := f()
go func(p unsafe.Pointer) {
g(uintptr(p))
runtime.KeepAlive(p)
}(tmp)
runtime.KeepAlive(tmp)  // superfluous, but harmless

So the unsafe.Pointer p will be kept alive at the time g call runs.

Updates #24491

Change-Id: Ic10821251cbb1b0073daec92b82a866c6ebaf567
Reviewed-on: https://go-review.googlesource.com/c/go/+/253457
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/cmd/compile/internal/gc/order.go
src/cmd/compile/internal/gc/syntax.go
src/cmd/compile/internal/gc/walk.go
test/fixedbugs/issue24491.go [new file with mode: 0644]