Parcourir la source

Propogate signals after handling (#8120)

elenadoty il y a 4 ans
Parent
commit
f510350abe

+ 1 - 1
Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c

@@ -223,7 +223,7 @@ static kern_return_t FIRCLSMachExceptionDispatchMessage(FIRCLSMachExceptionReadC
   }
 
   FIRCLSSDKLog("Restoring original signal handlers\n");
-  if (!FIRCLSSignalSafeInstallPreexistingHandlers(&_firclsContext.readonly->signal)) {
+  if (!FIRCLSSignalSafeInstallPreexistingHandlers(& _firclsContext.readonly->signal, -1, NULL, NULL)) {
     FIRCLSSDKLog("Failed to restore signal handlers\n");
     return KERN_FAILURE;
   }

+ 30 - 17
Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c

@@ -145,22 +145,26 @@ void FIRCLSSignalCheckHandlers(void) {
 }
 
 void FIRCLSSignalSafeRemoveHandlers(bool includingAbort) {
-  for (int i = 0; i < FIRCLSSignalCount; ++i) {
+  FIRCLSSignalEnumerateHandledSignals(^(int idx, int signal) {
     struct sigaction sa;
 
-    if (!includingAbort && (FIRCLSFatalSignals[i] == SIGABRT)) {
-      continue;
+    if (!includingAbort && (signal == SIGABRT)) {
+      return;
     }
 
     sa.sa_handler = SIG_DFL;
     sigemptyset(&sa.sa_mask);
 
-    if (sigaction(FIRCLSFatalSignals[i], &sa, NULL) != 0)
-      FIRCLSSDKLog("Unable to set default handler for %d (%s)\n", i, strerror(errno));
-  }
+    if (sigaction(signal, &sa, NULL) != 0) {
+          FIRCLSSDKLog("Unable to set default handler for %d (%s)\n", signal, strerror(errno));
+        }
+  });
 }
 
-bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roContext) {
+bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roContext,
+                                                const int signal,
+                                                siginfo_t *info,
+                                                void *uapVoid) {
   __block bool success = true;
 
   FIRCLSSignalSafeRemoveHandlers(true);
@@ -180,15 +184,23 @@ bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roConte
 
   // re-install the original handlers, if any
   FIRCLSSignalEnumerateHandledSignals(^(int idx, int currentSignal) {
-    if (roContext->originalActions[idx].sa_sigaction == NULL) {
-      return;
-    }
-
-    if (sigaction(currentSignal, &roContext->originalActions[idx], 0) != 0) {
-      FIRCLSSDKLog("Unable to install handler for %d (%s)\n", currentSignal, strerror(errno));
-      success = false;
-    }
-  });
+      if (roContext->originalActions[idx].sa_sigaction == NULL) {
+        return;
+      }
+
+      if (sigaction(currentSignal, &roContext->originalActions[idx], 0) != 0) {
+        FIRCLSSDKLog("Unable to install handler for %d (%s)\n", currentSignal, strerror(errno));
+        success = false;
+      }
+
+      // invoke original handler for current signal
+      if (signal < 0) {
+        return;
+      }
+      if (signal == currentSignal) {
+        roContext->originalActions[idx].sa_sigaction(signal, info, uapVoid);
+      }
+    });
 
   return success;
 }
@@ -310,7 +322,8 @@ static void FIRCLSSignalHandler(int signal, siginfo_t *info, void *uapVoid) {
 
   // re-install original handlers
   if (_firclsContext.readonly) {
-    FIRCLSSignalSafeInstallPreexistingHandlers(&_firclsContext.readonly->signal);
+    FIRCLSSignalSafeInstallPreexistingHandlers(&_firclsContext.readonly->signal, signal, info,
+                                                   uapVoid);
   }
 
   // restore errno

+ 4 - 1
Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h

@@ -45,7 +45,10 @@ void FIRCLSSignalInitialize(FIRCLSSignalReadContext* roContext);
 void FIRCLSSignalCheckHandlers(void);
 
 void FIRCLSSignalSafeRemoveHandlers(bool includingAbort);
-bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext* roContext);
+bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext* roContext,
+                                                const int signal,
+                                                siginfo_t* info,
+                                                void* uapVoid);
 
 void FIRCLSSignalNameLookup(int number, int code, const char** name, const char** codeName);