aboutsummaryrefslogtreecommitdiffstats
path: root/signal.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-18 00:07:58 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-19 00:06:53 +0900
commitd1992d6df2abfb6f8d7c6700367c2b5c606ed5b4 (patch)
treea1f1e15f122db31d07dfbacf056903fac4fd1ccb /signal.c
parentebeecbd575a8df1ec235eea740f190e811c27228 (diff)
downloadruby-d1992d6df2abfb6f8d7c6700367c2b5c606ed5b4.tar.gz
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.
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c11
1 files changed, 8 insertions, 3 deletions
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));