• Austin Clements's avatar
    runtime: fix dangling pointer in readyExecute · c1c66754
    Austin Clements authored
    readyExecute passes a closure to mcall that captures an argument to
    readyExecute. Since mcall is marked noescape, this closure lives on
    the stack of the calling goroutine. However, the closure puts the
    calling goroutine on the run queue (and switches to a new
    goroutine). If the calling goroutine gets scheduled before the mcall
    returns, this stack-allocated closure will become invalid while it's
    still executing. One consequence of this we've observed is that the
    captured gp variable can get overwritten before the call to
    execute(gp), causing execute(gp) to segfault.
    
    Fix this by passing the currently captured gp variable through a field
    in the calling goroutine's g struct so that the func is no longer a
    closure.
    
    To prevent problems like this in the future, this change also removes
    the go:noescape annotation from mcall. Due to a compiler bug, this
    will currently cause a func closure passed to mcall to be implicitly
    allocated rather than refusing the implicit allocation. However, this
    is okay because there are no other closures passed to mcall right now
    and the compiler bug will be fixed shortly.
    
    Fixes #10428.
    
    Change-Id: I49b48b85de5643323b89e9eaa4df63854e968c32
    Reviewed-on: https://go-review.googlesource.com/8866
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarDavid Chase <drchase@google.com>
    Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    c1c66754
Name
Last commit
Last update
api Loading commit data...
doc Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...