aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2016-01-26 17:26:55 -0500
committerRuss Cox <rsc@golang.org>2016-01-27 02:22:09 +0000
commit08594ac7c7e123d4aa46f60690da0a7e4034f4e9 (patch)
treef5388c6c0baaaac714e08c2078e2304ecf0b201b
parenteb3b1830b01fca572fcdd9c95aeb8090e6c09497 (diff)
downloadgo-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.go7
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