From f2573dc51ea2248a318b2f6863a79aa8d2fa79b0 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Mon, 19 Aug 2024 10:11:38 +0100 Subject: [PATCH] fix: Do not overwrite existing signal handlers (#5062) Such handlers can come from address sanitizers and similar. When combined with #4971, this forward-ports https://github.com/rust-lang/rust/commit/676b9bc477dfe58971b7df9df4e3a053bb187dee / rust-lang/rust#69685 --------- Co-authored-by: Sebastian Ullrich --- src/runtime/stack_overflow.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/runtime/stack_overflow.cpp b/src/runtime/stack_overflow.cpp index 262ebab739..73cb51c426 100644 --- a/src/runtime/stack_overflow.cpp +++ b/src/runtime/stack_overflow.cpp @@ -18,6 +18,7 @@ Port of the corresponding Rust code (see links below). #include #include #include +#include #include "runtime/stack_overflow.h" namespace lean { @@ -45,7 +46,7 @@ stack_guard::stack_guard() { stack_guard::~stack_guard() {} #else // Install a segfault signal handler and abort with custom message if address is within stack guard. -// https://github.com/rust-lang/rust/blob/master/src/libstd/sys/unix/stack_overflow.rs +// https://github.com/rust-lang/rust/blob/master/library/std/src/sys/pal/unix/stack_overflow.rs // https://github.com/rust-lang/rust/blob/7c8dbd969dd0ef2af6d8bab9e03ba7ce6cac41a2/src/libstd/sys/unix/thread.rs#L293 @@ -102,12 +103,17 @@ void initialize_stack_overflow() { #ifdef LEAN_WINDOWS AddVectoredExceptionHandler(0, stack_overflow_handler); #else - struct sigaction action; - memset(&action, 0, sizeof(struct sigaction)); - action.sa_flags = SA_SIGINFO | SA_ONSTACK; - action.sa_sigaction = segv_handler; - sigaction(SIGSEGV, &action, nullptr); - sigaction(SIGBUS, &action, nullptr); + for (auto signum : {SIGSEGV, SIGBUS}) { + struct sigaction action; + memset(&action, 0, sizeof(struct sigaction)); + sigaction(signum, nullptr, &action); + // Configure our signal handler if one is not already set. + if (action.sa_handler == SIG_DFL) { + action.sa_flags = SA_SIGINFO | SA_ONSTACK; + action.sa_sigaction = segv_handler; + sigaction(signum, &action, nullptr); + } + } #endif }