mirror of
https://github.com/golang/go
synced 2024-11-18 15:24:41 -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:
parent
efaa36017e
commit
7faf702396
@ -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)
|
||||
|
||||
|
@ -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:
|
||||
|
11
src/runtime/testdata/testprog/deadlock.go
vendored
11
src/runtime/testdata/testprog/deadlock.go
vendored
@ -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{})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user