Skip to content

Commit f510350

Browse files
authored
Propogate signals after handling (#8120)
1 parent 6e7b29c commit f510350

File tree

3 files changed

+35
-19
lines changed

3 files changed

+35
-19
lines changed

Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ static kern_return_t FIRCLSMachExceptionDispatchMessage(FIRCLSMachExceptionReadC
223223
}
224224

225225
FIRCLSSDKLog("Restoring original signal handlers\n");
226-
if (!FIRCLSSignalSafeInstallPreexistingHandlers(&_firclsContext.readonly->signal)) {
226+
if (!FIRCLSSignalSafeInstallPreexistingHandlers(& _firclsContext.readonly->signal, -1, NULL, NULL)) {
227227
FIRCLSSDKLog("Failed to restore signal handlers\n");
228228
return KERN_FAILURE;
229229
}

Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -145,22 +145,26 @@ void FIRCLSSignalCheckHandlers(void) {
145145
}
146146

147147
void FIRCLSSignalSafeRemoveHandlers(bool includingAbort) {
148-
for (int i = 0; i < FIRCLSSignalCount; ++i) {
148+
FIRCLSSignalEnumerateHandledSignals(^(int idx, int signal) {
149149
struct sigaction sa;
150150

151-
if (!includingAbort && (FIRCLSFatalSignals[i] == SIGABRT)) {
152-
continue;
151+
if (!includingAbort && (signal == SIGABRT)) {
152+
return;
153153
}
154154

155155
sa.sa_handler = SIG_DFL;
156156
sigemptyset(&sa.sa_mask);
157157

158-
if (sigaction(FIRCLSFatalSignals[i], &sa, NULL) != 0)
159-
FIRCLSSDKLog("Unable to set default handler for %d (%s)\n", i, strerror(errno));
160-
}
158+
if (sigaction(signal, &sa, NULL) != 0) {
159+
FIRCLSSDKLog("Unable to set default handler for %d (%s)\n", signal, strerror(errno));
160+
}
161+
});
161162
}
162163

163-
bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roContext) {
164+
bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roContext,
165+
const int signal,
166+
siginfo_t *info,
167+
void *uapVoid) {
164168
__block bool success = true;
165169

166170
FIRCLSSignalSafeRemoveHandlers(true);
@@ -180,15 +184,23 @@ bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roConte
180184

181185
// re-install the original handlers, if any
182186
FIRCLSSignalEnumerateHandledSignals(^(int idx, int currentSignal) {
183-
if (roContext->originalActions[idx].sa_sigaction == NULL) {
184-
return;
185-
}
186-
187-
if (sigaction(currentSignal, &roContext->originalActions[idx], 0) != 0) {
188-
FIRCLSSDKLog("Unable to install handler for %d (%s)\n", currentSignal, strerror(errno));
189-
success = false;
190-
}
191-
});
187+
if (roContext->originalActions[idx].sa_sigaction == NULL) {
188+
return;
189+
}
190+
191+
if (sigaction(currentSignal, &roContext->originalActions[idx], 0) != 0) {
192+
FIRCLSSDKLog("Unable to install handler for %d (%s)\n", currentSignal, strerror(errno));
193+
success = false;
194+
}
195+
196+
// invoke original handler for current signal
197+
if (signal < 0) {
198+
return;
199+
}
200+
if (signal == currentSignal) {
201+
roContext->originalActions[idx].sa_sigaction(signal, info, uapVoid);
202+
}
203+
});
192204

193205
return success;
194206
}
@@ -310,7 +322,8 @@ static void FIRCLSSignalHandler(int signal, siginfo_t *info, void *uapVoid) {
310322

311323
// re-install original handlers
312324
if (_firclsContext.readonly) {
313-
FIRCLSSignalSafeInstallPreexistingHandlers(&_firclsContext.readonly->signal);
325+
FIRCLSSignalSafeInstallPreexistingHandlers(&_firclsContext.readonly->signal, signal, info,
326+
uapVoid);
314327
}
315328

316329
// restore errno

Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ void FIRCLSSignalInitialize(FIRCLSSignalReadContext* roContext);
4545
void FIRCLSSignalCheckHandlers(void);
4646

4747
void FIRCLSSignalSafeRemoveHandlers(bool includingAbort);
48-
bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext* roContext);
48+
bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext* roContext,
49+
const int signal,
50+
siginfo_t* info,
51+
void* uapVoid);
4952

5053
void FIRCLSSignalNameLookup(int number, int code, const char** name, const char** codeName);
5154

0 commit comments

Comments
 (0)