summaryrefslogtreecommitdiffstats
path: root/signal.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-07-20 21:23:21 -0700
committerKaz Kylheku <kaz@kylheku.com>2014-07-20 21:23:21 -0700
commitec1b8794dd3fdbff6311d955b63df3b7b27038c9 (patch)
tree8260ff34a79481b53545a150fca3c83bc3fc16b5 /signal.c
parent636ad323c664f292802316c2da93767e9332f731 (diff)
downloadtxr-ec1b8794dd3fdbff6311d955b63df3b7b27038c9.tar.gz
txr-ec1b8794dd3fdbff6311d955b63df3b7b27038c9.tar.bz2
txr-ec1b8794dd3fdbff6311d955b63df3b7b27038c9.zip
* 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.
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c4
1 files changed, 2 insertions, 2 deletions
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