1
0
mirror of https://github.com/golang/go synced 2024-11-18 13:44:48 -07:00

runtime: avoid endless loop if printing the panic value panics

Change-Id: I56de359a5ccdc0a10925cd372fa86534353c6ca0
Reviewed-on: https://go-review.googlesource.com/30358
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Ian Lance Taylor 2016-10-04 21:15:42 -07:00
parent efaa36017e
commit 7faf702396
3 changed files with 23 additions and 0 deletions

View File

@ -444,6 +444,13 @@ func TestPanicDeadlockSyscall(t *testing.T) {
testPanicDeadlock(t, "SyscallInPanic", "1\n2\npanic: 3\n\n")
}
func TestPanicLoop(t *testing.T) {
output := runTestProg(t, "testprog", "PanicLoop")
if want := "panic while printing panic value"; !strings.Contains(output, want) {
t.Errorf("output does not contain %q:\n%s", want, output)
}
}
func TestMemPprof(t *testing.T) {
testenv.MustHaveGoRun(t)

View File

@ -376,6 +376,11 @@ func Goexit() {
// Used when crashing with panicking.
// This must match types handled by printany.
func preprintpanics(p *_panic) {
defer func() {
if recover() != nil {
throw("panic while printing panic value")
}
}()
for p != nil {
switch v := p.arg.(type) {
case error:

View File

@ -32,6 +32,7 @@ func init() {
register("PanicTraceback", PanicTraceback)
register("GoschedInPanic", GoschedInPanic)
register("SyscallInPanic", SyscallInPanic)
register("PanicLoop", PanicLoop)
}
func SimpleDeadlock() {
@ -214,3 +215,13 @@ func pt2() {
}()
panic("hello")
}
type panicError struct{}
func (*panicError) Error() string {
panic("double error")
}
func PanicLoop() {
panic(&panicError{})
}