summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-03-07 16:47:32 -0500
committerPeter Zhu <peter@peterzhu.ca>2024-03-12 09:43:49 -0400
commit1e7ee871cbf10375ca149a32d71a29e5e60eed6c (patch)
tree4ce5c701ab4dc377e9d0e3331c854c8c76e59dfd
parentad2aa6d72703f4ec9f7a1769cc3c51b1fc9f7586 (diff)
Disregard si_addr for fatal signals sent from other processes
Previously, when another process sends a fatal signals such as SIGBUS to Ruby, we could mis-interpret it as a stack overflow Ruby itself generated. When the si_pid field is set on the signal, we shouldn't check the si_addr field to check for stack overflow. > Signals sent with kill(2) and sigqueue(3) fill in si_pid and si_uid. Co-authored-by: Alan Wu <alanwu@ruby-lang.org>
-rw-r--r--signal.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/signal.c b/signal.c
index 3932e97d27..636574ba07 100644
--- a/signal.c
+++ b/signal.c
@@ -872,9 +872,9 @@ check_stack_overflow(int sig, const void *addr)
# else
# define FAULT_ADDRESS info->si_addr
# ifdef USE_UCONTEXT_REG
-# define CHECK_STACK_OVERFLOW() check_stack_overflow(sig, (uintptr_t)FAULT_ADDRESS, ctx)
+# define CHECK_STACK_OVERFLOW() (info->si_pid ? (void)0 : check_stack_overflow(sig, (uintptr_t)FAULT_ADDRESS, ctx))
# else
-# define CHECK_STACK_OVERFLOW() check_stack_overflow(sig, FAULT_ADDRESS)
+# define CHECK_STACK_OVERFLOW() (info->si_pid ? (void)0 : check_stack_overflow(sig, FAULT_ADDRESS))
# endif
# define MESSAGE_FAULT_ADDRESS " at %p", FAULT_ADDRESS
# endif