diff options
| author | Ian Lance Taylor <iant@golang.org> | 2016-03-04 11:29:55 -0800 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2016-03-04 21:06:31 +0000 |
| commit | 1716162a9a17873448427b7aca28efd151b5af07 (patch) | |
| tree | db925346389ff60d77b5c123af66d838109248b3 /src/runtime/panic.go | |
| parent | afd835434c34178eb8b8b8a89a7a41f5ec35c47c (diff) | |
| download | go-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.go | 17 |
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) } |
