mirror of
https://github.com/golang/go
synced 2024-11-12 09:30:25 -07:00
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>
This commit is contained in:
parent
eb3b1830b0
commit
08594ac7c7
@ -529,7 +529,12 @@ func traceEvent(ev byte, skip int, args ...uint64) {
|
||||
nstk = callers(skip, buf.stk[:])
|
||||
} else if gp != nil {
|
||||
gp = mp.curg
|
||||
// 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
|
||||
|
Loading…
Reference in New Issue
Block a user