From 1a894ea4dbb6c042c5eb447839549c5f2d4f4e17 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 23 Jun 2008 22:33:28 +0200 Subject: [PATCH] Reenter the fatal_signal_handler in case of nested signal. --- ChangeLog | 5 +++++ lib/fatal-signal.c | 14 ++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 70743d254..5a9b26ead 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 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. * lib/signal.in.h: Likewise. diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c index eca46dba0..64b346d87 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) -- 2.11.0