diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | signal.c | 4 |
2 files changed, 11 insertions, 2 deletions
@@ -1,5 +1,14 @@ 2014-07-20 Kaz Kylheku <kaz@kylheku.com> + * 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. + +2014-07-20 Kaz Kylheku <kaz@kylheku.com> + * eval.c (caseq_s, caseql_s, casequal_s, memq_s, memql_s, memqual_s, eq_s, eql_s, equal_s): New symbol variables. (me_case): New static function. @@ -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 |