From b3bb8922d0fd322977becbd5deb097663bbcccd9 Mon Sep 17 00:00:00 2001 From: Colin Patrick McCabe Date: Mon, 27 Dec 2010 18:04:17 -0800 Subject: [PATCH] signals: handle_fatal_signal: use SA_NODEFER SA_RESETHAND | SA_NODEFER allows the "re-trigger default signal handler" trick to work for signals other than SIGSEGV. Signed-off-by: Colin McCabe --- src/config.cc | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/config.cc b/src/config.cc index 8f843d6b3254e..b92eb4857b0bf 100644 --- a/src/config.cc +++ b/src/config.cc @@ -248,7 +248,18 @@ void handle_fatal_signal(int signum) _dout->flush(); // Use default handler to dump core - kill(getpid(), signum); + int ret = raise(signum); + + // Normally, we won't get here. If we do, something is very weird. + if (ret) { + *_dout << "handle_fatal_signal: failed to re-raise signal " << signum + << std::endl; + } + else { + *_dout << "handle_fatal_signal: default handler for signal " << signum + << " didn't terminate the process?" << std::endl; + } + exit(1); } #define _STR(x) #x @@ -1293,14 +1304,14 @@ void parse_config_options(std::vector& args) } install_sighandler(SIGHUP, sighup_handler, SA_RESTART); - install_sighandler(SIGSEGV, handle_fatal_signal, SA_RESETHAND); - install_sighandler(SIGABRT, handle_fatal_signal, SA_RESETHAND); - install_sighandler(SIGBUS, handle_fatal_signal, SA_RESETHAND); - install_sighandler(SIGILL, handle_fatal_signal, SA_RESETHAND); - install_sighandler(SIGFPE, handle_fatal_signal, SA_RESETHAND); - install_sighandler(SIGXCPU, handle_fatal_signal, SA_RESETHAND); - install_sighandler(SIGXFSZ, handle_fatal_signal, SA_RESETHAND); - install_sighandler(SIGSYS, handle_fatal_signal, SA_RESETHAND); + install_sighandler(SIGSEGV, handle_fatal_signal, SA_RESETHAND | SA_NODEFER); + install_sighandler(SIGABRT, handle_fatal_signal, SA_RESETHAND | SA_NODEFER); + install_sighandler(SIGBUS, handle_fatal_signal, SA_RESETHAND | SA_NODEFER); + install_sighandler(SIGILL, handle_fatal_signal, SA_RESETHAND | SA_NODEFER); + install_sighandler(SIGFPE, handle_fatal_signal, SA_RESETHAND | SA_NODEFER); + install_sighandler(SIGXCPU, handle_fatal_signal, SA_RESETHAND | SA_NODEFER); + install_sighandler(SIGXFSZ, handle_fatal_signal, SA_RESETHAND | SA_NODEFER); + install_sighandler(SIGSYS, handle_fatal_signal, SA_RESETHAND | SA_NODEFER); args = nargs; } -- 2.39.5