Reset SIGABRT action only if FailureSignalHandler is installed.
authorYoshisato Yanagisawa <yyanagisawa@google.com>
Wed, 18 Nov 2015 06:40:12 +0000 (15:40 +0900)
committerYoshisato Yanagisawa <yyanagisawa@google.com>
Thu, 26 Nov 2015 07:19:22 +0000 (16:19 +0900)
When I set my own signal handler to SIGABRT, it did not executed
with CHECK.  That is because SIGABRT handler is reset to default
just before glog calls abort.
Let me make it reset only if the handler is what glog installed
i.e. FailureSignalHandler.

src/glog/logging.h.in
src/signalhandler.cc
src/utilities.cc
src/windows/glog/logging.h

index 455bd2885133d98839dbf487da31873052bf0b97..b1de2c98ef0e3a244632f6f0d09b6789353d338e 100644 (file)
@@ -923,6 +923,9 @@ template <bool>
 struct CompileAssert {
 };
 struct CrashReason;
+
+// Returns true if FailureSignalHandler is installed.
+bool IsFailureSignalHandlerInstalled();
 }  // namespace glog_internal_namespace_
 
 #define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \
index cccd800d7696ea113ae320c6fed8415d12c24b8f..a7aef8b99d294b234c4f5ec74cc054edb28f6124 100644 (file)
@@ -335,6 +335,22 @@ void FailureSignalHandler(int signal_number,
 
 #endif  // HAVE_SIGACTION
 
+namespace glog_internal_namespace_ {
+
+bool IsFailureSignalHandlerInstalled() {
+#ifdef HAVE_SIGACTION
+  struct sigaction sig_action;
+  memset(&sig_action, 0, sizeof(sig_action));
+  sigemptyset(&sig_action.sa_mask);
+  sigaction(SIGABRT, NULL, &sig_action);
+  if (sig_action.sa_sigaction == &FailureSignalHandler)
+    return true;
+#endif  // HAVE_SIGACTION
+  return false;
+}
+
+}  // namespace glog_internal_namespace_
+
 void InstallFailureSignalHandler() {
 #ifdef HAVE_SIGACTION
   // Build the sigaction struct.
index f31c7c72b69051776c69b93ad936b4c8a98f38d9..5c88e58d3c065fc51feb59dfc1f69baa4465c117 100644 (file)
@@ -138,13 +138,15 @@ static void DumpStackTraceAndExit() {
 
   // TOOD(hamaji): Use signal instead of sigaction?
 #ifdef HAVE_SIGACTION
-  // Set the default signal handler for SIGABRT, to avoid invoking our
-  // own signal handler installed by InstallFailedSignalHandler().
-  struct sigaction sig_action;
-  memset(&sig_action, 0, sizeof(sig_action));
-  sigemptyset(&sig_action.sa_mask);
-  sig_action.sa_handler = SIG_DFL;
-  sigaction(SIGABRT, &sig_action, NULL);
+  if (IsFailureSignalHandlerInstalled()) {
+    // Set the default signal handler for SIGABRT, to avoid invoking our
+    // own signal handler installed by InstallFailureSignalHandler().
+    struct sigaction sig_action;
+    memset(&sig_action, 0, sizeof(sig_action));
+    sigemptyset(&sig_action.sa_mask);
+    sig_action.sa_handler = SIG_DFL;
+    sigaction(SIGABRT, &sig_action, NULL);
+  }
 #endif  // HAVE_SIGACTION
 
   abort();
index bab8c612500d25928b4f0cd59987a2e0b3aadfa0..36107a6fcf6daf1894a1f60778cb578c33cda7d8 100755 (executable)
@@ -910,6 +910,9 @@ template <bool>
 struct CompileAssert {
 };
 struct CrashReason;
+
+// Returns true if FailureSignalHandler is installed.
+bool IsFailureSignalHandlerInstalled();
 }  // namespace glog_internal_namespace_
 
 #define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \