diff options
author | Peter Zhu <peter@peterzhu.ca> | 2024-03-07 16:47:32 -0500 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2024-03-12 09:43:49 -0400 |
commit | 1e7ee871cbf10375ca149a32d71a29e5e60eed6c (patch) | |
tree | 4ce5c701ab4dc377e9d0e3331c854c8c76e59dfd | |
parent | ad2aa6d72703f4ec9f7a1769cc3c51b1fc9f7586 (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.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -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 |