]> Cypherpunks repositories - gostls13.git/commit
runtime: keep g->syscallsp consistent after cgo->Go callbacks
authorHector Martin Cantero <hector@marcansoft.com>
Wed, 24 Sep 2014 17:20:25 +0000 (13:20 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 24 Sep 2014 17:20:25 +0000 (13:20 -0400)
commit7283e08cbf06bcd32a391183e26080cff301e7f9
treea0badddaa894c277fddbbcab13caf224f3815dff
parenta69e504a34bb965850cbab6fdc1b4bc687cdd0c5
runtime: keep g->syscallsp consistent after cgo->Go callbacks

Normally, the caller to runtime.entersyscall() must not return before
calling runtime.exitsyscall(), lest g->syscallsp become a dangling
pointer. runtime.cgocallbackg() violates this constraint. To work around
this, save g->syscallsp and g->syscallpc around cgo->Go callbacks, then
restore them after calling runtime.entersyscall(), which restores the
syscall stack frame pointer saved by cgocall. This allows the GC to
correctly trace a goroutine that is currently returning from a
Go->cgo->Go chain.

This also adds a check to proc.c that panics if g->syscallsp is clearly
invalid. It is not 100% foolproof, as it will not catch a case where the
stack was popped then pushed back beyond g->syscallsp, but it does catch
the present cgo issue and makes existing tests fail without the bugfix.

Fixes #7978.

LGTM=dvyukov, rsc
R=golang-codereviews, dvyukov, minux, bradfitz, iant, gobot, rsc
CC=golang-codereviews, rsc
https://golang.org/cl/131910043
misc/cgo/test/cgo_test.go
misc/cgo/test/issue7978.go [new file with mode: 0644]
src/run.bash
src/run.bat
src/runtime/cgocall.go
src/runtime/proc.c
src/runtime/runtime.h
src/runtime/stubs.go