]> Cypherpunks repositories - gostls13.git/commit
runtime: avoid race between SIGPROF traceback and stack barriers
authorAustin Clements <austin@google.com>
Tue, 28 Jul 2015 18:33:39 +0000 (14:33 -0400)
committerAustin Clements <austin@google.com>
Wed, 29 Jul 2015 19:31:46 +0000 (19:31 +0000)
commit87f97c73d37d41e8de261215f7dc7768697246b5
tree1b8aa31dafb514f068e3f5f2e1a8d94c67e915f2
parente95bc5fef7e5e21cfdcae3095fcb8280bc3a72f8
runtime: avoid race between SIGPROF traceback and stack barriers

The following sequence of events can lead to the runtime attempting an
out-of-bounds access on a stack barrier slice:

1. A SIGPROF comes in on a thread while the G on that thread is in
   _Gsyscall. The sigprof handler calls gentraceback, which saves a
   local copy of the G's stkbar slice. Currently the G has no stack
   barriers, so this slice is empty.

2. On another thread, the GC concurrently scans the stack of the
   goroutine being profiled (it considers it stopped because it's in
   _Gsyscall) and installs stack barriers.

3. Back on the sigprof thread, gentraceback comes across a stack
   barrier in the stack and attempts to look it up in its (zero
   length) copy of G's old stkbar slice, which causes an out-of-bounds
   access.

This commit fixes this by adding a simple cas spin to synchronize the
SIGPROF handler with stack barrier insertion.

In general I would prefer that this synchronization be done through
the G status, since that's how stack scans are otherwise synchronized,
but adding a new lock is a much smaller change and G statuses are full
of subtlety.

Fixes #11863.

Change-Id: Ie89614a6238bb9c6a5b1190499b0b48ec759eaf7
Reviewed-on: https://go-review.googlesource.com/12748
Reviewed-by: Russ Cox <rsc@golang.org>
src/runtime/proc1.go
src/runtime/runtime2.go