diff options
author | Pedro Alves <palves@redhat.com> | 2012-01-23 16:40:26 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2012-01-23 16:40:26 +0000 |
commit | 01b1789443badeda4f875ed61a194ca419982622 (patch) | |
tree | 58ca05048a308ba2d820b49196bfd4b7526ad362 /gdb | |
parent | 77a35dd897bf8b3ea4a54f6da6043165d439dfd2 (diff) | |
download | gdb-01b1789443badeda4f875ed61a194ca419982622.zip gdb-01b1789443badeda4f875ed61a194ca419982622.tar.gz gdb-01b1789443badeda4f875ed61a194ca419982622.tar.bz2 |
2012-01-23 Pedro Alves <palves@redhat.com>
* server.c (main): Avoid yet another case of infinite loop while
detaching/killing after a longjmp.
Diffstat (limited to 'gdb')
-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 dfc5cdd..57ac46d 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 3080a0c..c1788a9 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, |