• Hector Martin Cantero's avatar
    runtime: keep g->syscallsp consistent after cgo->Go callbacks · 7283e08c
    Hector Martin Cantero authored
    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
    7283e08c
Name
Last commit
Last update
..
backdoor Loading commit data...
align.go Loading commit data...
api.go Loading commit data...
basic.go Loading commit data...
buildid_linux.go Loading commit data...
callback.go Loading commit data...
callback_c.c Loading commit data...
callback_c_gc.c Loading commit data...
callback_c_gccgo.c Loading commit data...
cflags.go Loading commit data...
cgo_linux_test.go Loading commit data...
cgo_test.go Loading commit data...
cthread.go Loading commit data...
cthread_unix.c Loading commit data...
cthread_windows.c Loading commit data...
duplicate_symbol.go Loading commit data...
env.go Loading commit data...
exports.go Loading commit data...
fpvar.go Loading commit data...
helpers.go Loading commit data...
issue1222.go Loading commit data...
issue1328.go Loading commit data...
issue1560.go Loading commit data...
issue1635.go Loading commit data...
issue2462.go Loading commit data...
issue3250.go Loading commit data...
issue3250w.go Loading commit data...
issue3261.go Loading commit data...
issue3729.go Loading commit data...
issue3729w.go Loading commit data...
issue3741.go Loading commit data...
issue3775.go Loading commit data...
issue3945.go Loading commit data...
issue4029.go Loading commit data...
issue4029w.go Loading commit data...
issue4054a.go Loading commit data...
issue4054b.go Loading commit data...
issue4273.c Loading commit data...
issue4273b.c Loading commit data...
issue4339.c Loading commit data...
issue4339.go Loading commit data...
issue4339.h Loading commit data...
issue4417.go Loading commit data...
issue4857.go Loading commit data...
issue5227.go Loading commit data...
issue5242.go Loading commit data...
issue5337.go Loading commit data...
issue5337w.go Loading commit data...
issue5548.go Loading commit data...
issue5548_c.c Loading commit data...
issue5603.go Loading commit data...
issue5740.go Loading commit data...
issue5740a.c Loading commit data...
issue5740b.c Loading commit data...
issue5986.go Loading commit data...
issue6128.go Loading commit data...
issue6390.go Loading commit data...
issue6472.go Loading commit data...
issue6506.go Loading commit data...
issue6612.go Loading commit data...
issue6833.go Loading commit data...
issue6833_c.c Loading commit data...
issue6997_linux.c Loading commit data...
issue6997_linux.go Loading commit data...
issue7234_test.go Loading commit data...
issue7560.go Loading commit data...
issue7665.go Loading commit data...
issue7695_test.go Loading commit data...
issue7786.go Loading commit data...
issue7978.go Loading commit data...
issue8092.go Loading commit data...
issue8148.go Loading commit data...
issue8331.h Loading commit data...
issue8331a.go Loading commit data...
issue8331b.go Loading commit data...
issue8428.go Loading commit data...
issue8441.go Loading commit data...
setgid_linux.go Loading commit data...
sleep_windows_386.go Loading commit data...