From d1992d6df2abfb6f8d7c6700367c2b5c606ed5b4 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 18 Jul 2023 00:07:58 +0900 Subject: Reset signal handler before aborting due to sanitizer When aborting by a sanitizer, `SIGILL` or something is raised and often results in raising the same signal infinitely. --- signal.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'signal.c') diff --git a/signal.c b/signal.c index 17dc12aeee..fa7d25caf5 100644 --- a/signal.c +++ b/signal.c @@ -880,10 +880,10 @@ check_stack_overflow(int sig, const void *addr) #endif #if defined SIGSEGV || defined SIGBUS || defined SIGILL || defined SIGFPE -NOINLINE(static void check_reserved_signal_(const char *name, size_t name_len)); +NOINLINE(static void check_reserved_signal_(const char *name, size_t name_len, int signo)); /* noinine to reduce stack usage in signal handers */ -#define check_reserved_signal(name) check_reserved_signal_(name, sizeof(name)-1) +#define check_reserved_signal(name) check_reserved_signal_(name, sizeof(name)-1, sig) #ifdef SIGBUS @@ -955,7 +955,7 @@ ruby_abort(void) } static void -check_reserved_signal_(const char *name, size_t name_len) +check_reserved_signal_(const char *name, size_t name_len, int signo) { const char *prev = ATOMIC_PTR_EXCHANGE(received_signal, name); @@ -975,6 +975,11 @@ check_reserved_signal_(const char *name, size_t name_len) # define W(str, len) err = write(stderr_fd, (str), (len)) #endif +#if __has_feature(address_sanitizer) || \ + __has_feature(memory_sanitizer) || \ + defined(HAVE_VALGRIND_MEMCHECK_H) + ruby_posix_signal(signo, SIG_DFL); +#endif W(name, name_len); W(msg1, sizeof(msg1)); W(prev, strlen(prev)); -- cgit v1.2.3