]> Cypherpunks.ru repositories - gostls13.git/commit
runtime: ensure that Goexit cannot be aborted by a recursive panic/recover
authorDan Scales <danscales@google.com>
Wed, 9 Oct 2019 19:18:26 +0000 (12:18 -0700)
committerDan Scales <danscales@google.com>
Mon, 4 Nov 2019 16:32:38 +0000 (16:32 +0000)
commit7dcd343ed641d3b70c09153d3b041ca3fe83b25e
tree78f84bf2886ea89ea9a292630fff54bcefdbd985
parenta8fc82f77abff99a3f55b015b017cb4342cd9c08
runtime: ensure that Goexit cannot be aborted by a recursive panic/recover

When we do a successful recover of a panic, we resume normal execution by
returning from the frame that had the deferred call that did the recover (after
executing any remaining deferred calls in that frame).

However, suppose we have called runtime.Goexit and there is a panic during one of the
deferred calls run by the Goexit. Further assume that there is a deferred call in
the frame of the Goexit or a parent frame that does a recover. Then the recovery
process will actually resume normal execution above the Goexit frame and hence
abort the Goexit.  We will not terminate the thread as expected, but continue
running in the frame above the Goexit.

To fix this, we explicitly create a _panic object for a Goexit call. We then
change the "abort" behavior for Goexits, but not panics. After a recovery, if the
top-level panic is actually a Goexit that is marked to be aborted, then we return
to the Goexit defer-processing loop, so that the Goexit is not actually aborted.

Actual code changes are just panic.go, runtime2.go, and funcid.go. Adjusted the
test related to the new Goexit behavior (TestRecoverBeforePanicAfterGoexit) and
added several new tests of aborted panics (whose behavior has not changed).

Fixes #29226

Change-Id: Ib13cb0074f5acc2567a28db7ca6912cfc47eecb5
Reviewed-on: https://go-review.googlesource.com/c/go/+/200081
Run-TryBot: Dan Scales <danscales@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/internal/objabi/funcid.go
src/runtime/callers_test.go
src/runtime/crash_test.go
src/runtime/defer_test.go
src/runtime/panic.go
src/runtime/runtime2.go
src/runtime/testdata/testprog/deadlock.go
test/fixedbugs/issue8047b.go