@@ -174,8 +174,6 @@ DECLARE_SIGNAL_HANDLER(trap_handler)
174
174
#error "CONTEXT_SP is required if HAS_STACK_OVERFLOW_DETECTION is defined"
175
175
#endif
176
176
177
- static char sig_alt_stack [SIGSTKSZ ];
178
-
179
177
/* Code compiled with ocamlopt never accesses more than
180
178
EXTRA_STACK bytes below the stack pointer. */
181
179
#define EXTRA_STACK 256
@@ -269,28 +267,33 @@ void caml_init_signals(void)
269
267
#endif
270
268
271
269
#ifdef HAS_STACK_OVERFLOW_DETECTION
272
- {
273
- stack_t stk ;
270
+ if (caml_setup_stack_overflow_detection () != -1 ) {
274
271
struct sigaction act ;
275
- stk .ss_sp = sig_alt_stack ;
276
- stk .ss_size = SIGSTKSZ ;
277
- stk .ss_flags = 0 ;
278
272
SET_SIGACT (act , segv_handler );
279
273
act .sa_flags |= SA_ONSTACK | SA_NODEFER ;
280
274
sigemptyset (& act .sa_mask );
281
- if ( sigaltstack ( & stk , NULL ) == 0 ) { sigaction (SIGSEGV , & act , NULL ); }
275
+ sigaction (SIGSEGV , & act , NULL );
282
276
}
283
277
#endif
284
278
}
285
279
286
- CAMLexport void caml_setup_stack_overflow_detection (void )
280
+ /* Allocate and select an alternate stack for handling signals,
281
+ especially SIGSEGV signals.
282
+ Each thread needs its own alternate stack.
283
+ The alternate stack used to be statically-allocated for the main thread,
284
+ but this is incompatible with Glibc 2.34 and newer, where SIGSTKSZ
285
+ may not be a compile-time constant (issue #10250). */
286
+
287
+ CAMLexport int caml_setup_stack_overflow_detection (void )
287
288
{
288
289
#ifdef HAS_STACK_OVERFLOW_DETECTION
289
290
stack_t stk ;
290
291
stk .ss_sp = malloc (SIGSTKSZ );
292
+ if (stk .ss_sp == NULL ) return -1 ;
291
293
stk .ss_size = SIGSTKSZ ;
292
294
stk .ss_flags = 0 ;
293
- if (stk .ss_sp )
294
- sigaltstack (& stk , NULL );
295
+ return sigaltstack (& stk , NULL );
296
+ #else
297
+ return 0 ;
295
298
#endif
296
299
}
0 commit comments