@@ -82,16 +82,22 @@ _swift_installCrashHandler()
82
82
{
83
83
stack_t ss;
84
84
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 )
91
87
return errno;
92
88
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
+ }
95
101
96
102
// Now register signal handlers
97
103
struct sigaction sa;
@@ -102,13 +108,21 @@ _swift_installCrashHandler()
102
108
}
103
109
104
110
sa.sa_handler = NULL ;
111
+ sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER;
112
+ sa.sa_sigaction = handle_fatal_signal;
105
113
106
114
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;
109
116
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 )
111
119
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
+ }
112
126
}
113
127
114
128
return 0 ;
0 commit comments