From ec1b8794dd3fdbff6311d955b63df3b7b27038c9 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 20 Jul 2014 21:23:21 -0700 Subject: * signal.c (set_sig_handler): Set up and tear down alternate stack for SIGBUS also, not only for SIGSEGV. On Linux, when stack growth collides with another memory mapping, it triggers a SIGBUS not SIGSEGV, which occurs when the process limit on stack size is exceeded. In either situation, we need an alternative stack. --- signal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'signal.c') diff --git a/signal.c b/signal.c index 086b0031..5072f09d 100644 --- a/signal.c +++ b/signal.c @@ -236,7 +236,7 @@ val set_sig_handler(val signo, val lambda) sa.sa_handler = sig_handler; sigfillset(&sa.sa_mask); #if HAVE_SIGALTSTACK - if (sig == SIGSEGV) + if (sig == SIGSEGV || sig == SIGBUS) setup_alt_stack(); sa.sa_flags |= SA_ONSTACK; #endif @@ -244,7 +244,7 @@ val set_sig_handler(val signo, val lambda) } #if HAVE_SIGALTSTACK - if (sig == SIGSEGV && (lambda == nil || lambda == t)) + if ((sig == SIGSEGV || sig == SIGBUS) && (lambda == nil || lambda == t)) teardown_alt_stack(); #endif -- cgit v1.2.3