Skip to content

Commit b9e79c4

Browse files
committed
[Backtracing][Runtime] Don't replace existing signal handlers.
If we find signal handlers already installed, leave them alone. rdar://105391747
1 parent 44be8cf commit b9e79c4

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

stdlib/public/runtime/CrashHandlerMacOS.cpp

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,22 @@ _swift_installCrashHandler()
8282
{
8383
stack_t ss;
8484

85-
// Install an alternate signal handling stack
86-
ss.ss_flags = 0;
87-
ss.ss_size = SIGSTKSZ;
88-
ss.ss_sp = mmap(0, ss.ss_size, PROT_READ | PROT_WRITE,
89-
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
90-
if (ss.ss_sp == MAP_FAILED)
85+
// See if an alternate signal stack already exists
86+
if (sigaltstack(NULL, &ss) < 0)
9187
return errno;
9288

93-
if (sigaltstack(&ss, 0) < 0)
94-
return errno;
89+
if (ss.ss_sp == 0) {
90+
// No, so set one up
91+
ss.ss_flags = 0;
92+
ss.ss_size = SIGSTKSZ;
93+
ss.ss_sp = mmap(0, ss.ss_size, PROT_READ | PROT_WRITE,
94+
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
95+
if (ss.ss_sp == MAP_FAILED)
96+
return errno;
97+
98+
if (sigaltstack(&ss, NULL) < 0)
99+
return errno;
100+
}
95101

96102
// Now register signal handlers
97103
struct sigaction sa;
@@ -102,13 +108,21 @@ _swift_installCrashHandler()
102108
}
103109

104110
sa.sa_handler = NULL;
111+
sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER;
112+
sa.sa_sigaction = handle_fatal_signal;
105113

106114
for (unsigned n = 0; n < lengthof(signalsToHandle); ++n) {
107-
sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER;
108-
sa.sa_sigaction = handle_fatal_signal;
115+
struct sigaction osa;
109116

110-
if (sigaction(signalsToHandle[n], &sa, NULL) < 0)
117+
// See if a signal handler for this signal is already installed
118+
if (sigaction(signalsToHandle[n], NULL, &osa) < 0)
111119
return errno;
120+
121+
if (osa.sa_handler == SIG_DFL) {
122+
// No, so install ours
123+
if (sigaction(signalsToHandle[n], &sa, NULL) < 0)
124+
return errno;
125+
}
112126
}
113127

114128
return 0;

0 commit comments

Comments
 (0)