From: Bruno Haible Date: Mon, 23 Jun 2008 20:33:28 +0000 (+0200) Subject: Reenter the fatal_signal_handler in case of nested signal. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a894ea4dbb6c042c5eb447839549c5f2d4f4e17;p=pspp Reenter the fatal_signal_handler in case of nested signal. --- diff --git a/ChangeLog b/ChangeLog index 70743d2545..5a9b26ead8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-06-23 Bruno Haible + + * lib/fatal-signal.c (fatal_signal_handler): Update comment. + (install_handlers): Don't set the SA_RESETHAND flag. + 2008-06-23 Bruno Haible * m4/sigaction.m4: Comment fixes. diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c index eca46dba0c..64b346d874 100644 --- a/lib/fatal-signal.c +++ b/lib/fatal-signal.c @@ -160,9 +160,10 @@ fatal_signal_handler (int sig) } /* Now execute the signal's default action. - If any cleanup action blocks the signal that triggered the cleanup, the - re-raised signal is delivered when this handler returns; otherwise it - is delivered already during raise(). */ + If the signal being delivered was blocked, the re-raised signal would be + delivered when this handler returns. But the way we install this handler, + no signal is blocked, and the re-raised signal is delivered already + during raise(). */ uninstall_handlers (); raise (sig); } @@ -176,9 +177,10 @@ install_handlers () struct sigaction action; action.sa_handler = &fatal_signal_handler; - /* One-shot handling - if we fault while handling a fault, the - cleanup actions are intentionally cut short. */ - action.sa_flags = SA_NODEFER | SA_RESETHAND; + /* If we get a fatal signal while executing fatal_signal_handler, enter + fatal_signal_handler recursively, since it is reentrant. Hence no + SA_RESETHAND. */ + action.sa_flags = SA_NODEFER; sigemptyset (&action.sa_mask); for (i = 0; i < num_fatal_signals; i++) if (fatal_signals[i] >= 0)