aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/panic.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2016-03-04 11:29:55 -0800
committerIan Lance Taylor <iant@golang.org>2016-03-04 21:06:31 +0000
commit1716162a9a17873448427b7aca28efd151b5af07 (patch)
treedb925346389ff60d77b5c123af66d838109248b3 /src/runtime/panic.go
parentafd835434c34178eb8b8b8a89a7a41f5ec35c47c (diff)
downloadgo-1716162a9a17873448427b7aca28efd151b5af07.tar.xz
runtime: fix off-by-one error finding module for PC
Also fix compiler-invoked panics to avoid a confusing "malloc deadlock" crash if they are invoked while executing the runtime. Fixes #14599. Change-Id: I89436abcbf3587901909abbdca1973301654a76e Reviewed-on: https://go-review.googlesource.com/20219 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/panic.go')
-rw-r--r--src/runtime/panic.go17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/runtime/panic.go b/src/runtime/panic.go
index 10065c1803..59fbc83369 100644
--- a/src/runtime/panic.go
+++ b/src/runtime/panic.go
@@ -9,39 +9,56 @@ import (
"unsafe"
)
+// Calling panic with one of the errors below will call errorString.Error
+// which will call mallocgc to concatenate strings. That will fail if
+// malloc is locked, causing a confusing error message. Throw a better
+// error message instead.
+func panicCheckMalloc(err error) {
+ gp := getg()
+ if gp != nil && gp.m != nil && gp.m.mallocing != 0 {
+ throw(string(err.(errorString)))
+ }
+}
+
var indexError = error(errorString("index out of range"))
func panicindex() {
+ panicCheckMalloc(indexError)
panic(indexError)
}
var sliceError = error(errorString("slice bounds out of range"))
func panicslice() {
+ panicCheckMalloc(sliceError)
panic(sliceError)
}
var divideError = error(errorString("integer divide by zero"))
func panicdivide() {
+ panicCheckMalloc(divideError)
panic(divideError)
}
var overflowError = error(errorString("integer overflow"))
func panicoverflow() {
+ panicCheckMalloc(overflowError)
panic(overflowError)
}
var floatError = error(errorString("floating point error"))
func panicfloat() {
+ panicCheckMalloc(floatError)
panic(floatError)
}
var memoryError = error(errorString("invalid memory address or nil pointer dereference"))
func panicmem() {
+ panicCheckMalloc(memoryError)
panic(memoryError)
}