From 2a650deecaa31ee0ae2ba7af9175d975a8b8289b Mon Sep 17 00:00:00 2001 From: Guillaume Bury Date: Tue, 22 Mar 2022 12:03:36 +0100 Subject: [PATCH] flambda-backend: Backport commit fc9534746bf5d08a4c109f22e344cf49d5d46d54 from trunk (#584) --- runtime/caml/signals.h | 2 +- runtime/signals_byt.c | 2 +- runtime/signals_nat.c | 25 ++++++++++++++----------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/runtime/caml/signals.h b/runtime/caml/signals.h index 3ff152c26933..285dbd7febdd 100644 --- a/runtime/caml/signals.h +++ b/runtime/caml/signals.h @@ -87,7 +87,7 @@ value caml_do_pending_actions_exn (void); value caml_process_pending_actions_with_root (value extra_root); // raises value caml_process_pending_actions_with_root_exn (value extra_root); int caml_set_signal_action(int signo, int action); -CAMLextern void caml_setup_stack_overflow_detection(void); +CAMLextern int caml_setup_stack_overflow_detection(void); CAMLextern void (*caml_enter_blocking_section_hook)(void); CAMLextern void (*caml_leave_blocking_section_hook)(void); diff --git a/runtime/signals_byt.c b/runtime/signals_byt.c index 2183142da180..38eb5e3a47ac 100644 --- a/runtime/signals_byt.c +++ b/runtime/signals_byt.c @@ -81,4 +81,4 @@ int caml_set_signal_action(int signo, int action) return 0; } -CAMLexport void caml_setup_stack_overflow_detection(void) {} +CAMLexport int caml_setup_stack_overflow_detection(void) { return 0; } diff --git a/runtime/signals_nat.c b/runtime/signals_nat.c index 1be1b45d4209..ca86956783ca 100644 --- a/runtime/signals_nat.c +++ b/runtime/signals_nat.c @@ -174,8 +174,6 @@ DECLARE_SIGNAL_HANDLER(trap_handler) #error "CONTEXT_SP is required if HAS_STACK_OVERFLOW_DETECTION is defined" #endif -static char sig_alt_stack[SIGSTKSZ]; - /* Code compiled with ocamlopt never accesses more than EXTRA_STACK bytes below the stack pointer. */ #define EXTRA_STACK 256 @@ -269,28 +267,33 @@ void caml_init_signals(void) #endif #ifdef HAS_STACK_OVERFLOW_DETECTION - { - stack_t stk; + if (caml_setup_stack_overflow_detection() != -1) { struct sigaction act; - stk.ss_sp = sig_alt_stack; - stk.ss_size = SIGSTKSZ; - stk.ss_flags = 0; SET_SIGACT(act, segv_handler); act.sa_flags |= SA_ONSTACK | SA_NODEFER; sigemptyset(&act.sa_mask); - if (sigaltstack(&stk, NULL) == 0) { sigaction(SIGSEGV, &act, NULL); } + sigaction(SIGSEGV, &act, NULL); } #endif } -CAMLexport void caml_setup_stack_overflow_detection(void) +/* Allocate and select an alternate stack for handling signals, + especially SIGSEGV signals. + Each thread needs its own alternate stack. + The alternate stack used to be statically-allocated for the main thread, + but this is incompatible with Glibc 2.34 and newer, where SIGSTKSZ + may not be a compile-time constant (issue #10250). */ + +CAMLexport int caml_setup_stack_overflow_detection(void) { #ifdef HAS_STACK_OVERFLOW_DETECTION stack_t stk; stk.ss_sp = malloc(SIGSTKSZ); + if (stk.ss_sp == NULL) return -1; stk.ss_size = SIGSTKSZ; stk.ss_flags = 0; - if (stk.ss_sp) - sigaltstack(&stk, NULL); + return sigaltstack(&stk, NULL); +#else + return 0; #endif }