• 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
cgocall.go 8.54 KB