From 01b1789443badeda4f875ed61a194ca419982622 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 23 Jan 2012 16:40:26 +0000 Subject: [PATCH] 2012-01-23 Pedro Alves * server.c (main): Avoid yet another case of infinite loop while detaching/killing after a longjmp. --- gdb/gdbserver/ChangeLog | 5 +++++ 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 + + * server.c (main): Avoid yet another case of infinite loop while + detaching/killing after a longjmp. + 2012-01-20 Jan Kratochvil 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, -- 2.30.2