diff options
author | Austin Clements <austin@google.com> | 2016-01-26 17:26:55 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2016-01-27 02:22:09 +0000 |
commit | 08594ac7c7e123d4aa46f60690da0a7e4034f4e9 (patch) | |
tree | f5388c6c0baaaac714e08c2078e2304ecf0b201b | |
parent | eb3b1830b01fca572fcdd9c95aeb8090e6c09497 (diff) | |
download | go-08594ac7c7e123d4aa46f60690da0a7e4034f4e9.tar.gz go-08594ac7c7e123d4aa46f60690da0a7e4034f4e9.zip |
runtime: acquire stack lock in traceEvent
traceEvent records system call events after a G has already entered
_Gsyscall, which means the garbage collector could be installing stack
barriers in the G's stack during the traceEvent. If traceEvent
attempts to capture the user stack during this, it may observe a
inconsistent stack barriers and panic. Fix this by acquiring the stack
lock around the stack walk in traceEvent.
Fixes #14101.
Change-Id: I15f0ab0c70c04c6e182221f65a6f761c5a896459
Reviewed-on: https://go-review.googlesource.com/18973
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
-rw-r--r-- | src/runtime/trace.go | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/runtime/trace.go b/src/runtime/trace.go index 58956383a3..805c34f483 100644 --- a/src/runtime/trace.go +++ b/src/runtime/trace.go @@ -529,7 +529,12 @@ func traceEvent(ev byte, skip int, args ...uint64) { nstk = callers(skip, buf.stk[:]) } else if gp != nil { gp = mp.curg - nstk = gcallers(gp, skip, buf.stk[:]) + // This may happen when tracing a system call, + // so we must lock the stack. + if gcTryLockStackBarriers(gp) { + nstk = gcallers(gp, skip, buf.stk[:]) + gcUnlockStackBarriers(gp) + } } if nstk > 0 { nstk-- // skip runtime.goexit |