• 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
api Loading commit data...
doc Loading commit data...
include Loading commit data...
lib Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.hgignore Loading commit data...
.hgtags Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...