@@ -145,22 +145,26 @@ void FIRCLSSignalCheckHandlers(void) {
145
145
}
146
146
147
147
void FIRCLSSignalSafeRemoveHandlers (bool includingAbort ) {
148
- for ( int i = 0 ; i < FIRCLSSignalCount ; ++ i ) {
148
+ FIRCLSSignalEnumerateHandledSignals (^( int idx , int signal ) {
149
149
struct sigaction sa ;
150
150
151
- if (!includingAbort && (FIRCLSFatalSignals [ i ] == SIGABRT )) {
152
- continue ;
151
+ if (!includingAbort && (signal == SIGABRT )) {
152
+ return ;
153
153
}
154
154
155
155
sa .sa_handler = SIG_DFL ;
156
156
sigemptyset (& sa .sa_mask );
157
157
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
+ });
161
162
}
162
163
163
- bool FIRCLSSignalSafeInstallPreexistingHandlers (FIRCLSSignalReadContext * roContext ) {
164
+ bool FIRCLSSignalSafeInstallPreexistingHandlers (FIRCLSSignalReadContext * roContext ,
165
+ const int signal ,
166
+ siginfo_t * info ,
167
+ void * uapVoid ) {
164
168
__block bool success = true;
165
169
166
170
FIRCLSSignalSafeRemoveHandlers (true);
@@ -180,15 +184,23 @@ bool FIRCLSSignalSafeInstallPreexistingHandlers(FIRCLSSignalReadContext *roConte
180
184
181
185
// re-install the original handlers, if any
182
186
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
+ });
192
204
193
205
return success ;
194
206
}
@@ -310,7 +322,8 @@ static void FIRCLSSignalHandler(int signal, siginfo_t *info, void *uapVoid) {
310
322
311
323
// re-install original handlers
312
324
if (_firclsContext .readonly ) {
313
- FIRCLSSignalSafeInstallPreexistingHandlers (& _firclsContext .readonly -> signal );
325
+ FIRCLSSignalSafeInstallPreexistingHandlers (& _firclsContext .readonly -> signal , signal , info ,
326
+ uapVoid );
314
327
}
315
328
316
329
// restore errno
0 commit comments