diff options
-rw-r--r-- | gdb/gdbserver/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 27 |
2 files changed, 23 insertions, 9 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index dfc5cdd8804..57ac46dd38f 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2012-01-23 Pedro Alves <palves@redhat.com> + + * server.c (main): Avoid yet another case of infinite loop while + detaching/killing after a longjmp. + 2012-01-20 Jan Kratochvil <jan.kratochvil@redhat.com> Code cleanup. diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 3080a0c3389..c1788a90f85 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -2727,13 +2727,10 @@ main (int argc, char *argv[]) inferiors, we'd end up here again, stuck in an infinite loop trap. Be sure that if that happens, we exit immediately instead. */ - if (setjmp (toplevel)) - { - fprintf (stderr, "Detach or kill failed. Exiting\n"); - exit (1); - } - - detach_or_kill_for_exit (); + if (setjmp (toplevel) == 0) + detach_or_kill_for_exit (); + else + fprintf (stderr, "Detach or kill failed. Exiting\n"); exit (1); } @@ -2779,8 +2776,20 @@ main (int argc, char *argv[]) if (exit_requested || run_once) { - detach_or_kill_for_exit (); - exit (0); + /* If something fails and longjmps while detaching or + killing inferiors, we'd end up here again, stuck in an + infinite loop trap. Be sure that if that happens, we + exit immediately instead. */ + if (setjmp (toplevel) == 0) + { + detach_or_kill_for_exit (); + exit (0); + } + else + { + fprintf (stderr, "Detach or kill failed. Exiting\n"); + exit (1); + } } fprintf (stderr, |