aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/panic.go
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2018-06-21 16:56:13 -0400
committerAustin Clements <austin@google.com>2018-06-22 00:28:25 +0000
commit4991bc6257a9e9d922f7b6e29e393d764c4e4295 (patch)
treed5783224ef0e0392d2395cbf0b1ab6fdf510e65e /src/runtime/panic.go
parent011ea87921cb37dc8e4147d99c22234f875d2651 (diff)
downloadgo-4991bc6257a9e9d922f7b6e29e393d764c4e4295.tar.gz
go-4991bc6257a9e9d922f7b6e29e393d764c4e4295.zip
runtime: avoid recursive panic on bad lock count
Currently, if lock or unlock calls throw because the g.m.lock count is corrupted, we're unlikely to get a stack trace because startpanic_m will itself attempt to acquire a lock, causing a recursive failure. Avoid this by forcing the g.m.locks count to a sane value if it's currently bad. This might be enough to get a stack trace from #25128. Change-Id: I52d7bd4717ffae94a821f4249585f3eb6cd5aa41 Reviewed-on: https://go-review.googlesource.com/120416 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/panic.go')
-rw-r--r--src/runtime/panic.go6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/runtime/panic.go b/src/runtime/panic.go
index 9ba7e1063f..ce367cfa70 100644
--- a/src/runtime/panic.go
+++ b/src/runtime/panic.go
@@ -716,6 +716,12 @@ func startpanic_m() bool {
// happen (even if we're not in one of these situations).
_g_.m.mallocing++
+ // If we're dying because of a bad lock count, set it to a
+ // good lock count so we don't recursively panic below.
+ if _g_.m.locks < 0 {
+ _g_.m.locks = 1
+ }
+
switch _g_.m.dying {
case 0:
_g_.m.dying = 1