changeset 30542:3dfd312c8cdc

Treat SIGBUS like SIFSEGV on platforms that need it.
author Bruno Haible <bruno@clisp.org>
date Sat, 06 Dec 2008 15:01:09 +0100
parents 09561daea3ef
children a5cf1b61376c
files ChangeLog lib/c-stack.c m4/c-stack.m4
diffstat 3 files changed, 42 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Dec 06 13:04:07 2008 +0100
+++ b/ChangeLog	Sat Dec 06 15:01:09 2008 +0100
@@ -1,3 +1,13 @@
+2008-12-06  Bruno Haible  <bruno@clisp.org>
+
+	Fix a c-stack test failure on MacOS X.
+	* m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Require
+	AC_CANONICAL_HOST. Define FAULT_YIELDS_SIGBUS. If set, install a signal
+	handler for SIGBUS as well.
+	* lib/c-stack.c (c_stack_action): If FAULT_YIELDS_SIGBUS is set,
+	install a signal handler for SIGBUS as well.
+	Reported by Bruce Dugan <bld0401@gmail.com> via Eric Blake.
+
 2008-12-06  Bruno Haible  <bruno@clisp.org>
 
 	Advocacy documentation.
--- a/lib/c-stack.c	Sat Dec 06 13:04:07 2008 +0100
+++ b/lib/c-stack.c	Sat Dec 06 15:01:09 2008 +0100
@@ -321,6 +321,10 @@
   act.sa_handler = die;
 # endif
 
+# if FAULT_YIELDS_SIGBUS
+  if (sigaction (SIGBUS, &act, NULL) < 0)
+    return -1;
+# endif
   return sigaction (SIGSEGV, &act, NULL);
 }
 
--- a/m4/c-stack.m4	Sat Dec 06 13:04:07 2008 +0100
+++ b/m4/c-stack.m4	Sat Dec 06 15:01:09 2008 +0100
@@ -7,14 +7,33 @@
 
 # Written by Paul Eggert.
 
-# serial 7
+# serial 8
 
 AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
   [# for STACK_DIRECTION
    AC_REQUIRE([AC_FUNC_ALLOCA])
+   AC_REQUIRE([AC_CANONICAL_HOST])
    AC_CHECK_FUNCS_ONCE([setrlimit])
    AC_CHECK_HEADERS_ONCE([ucontext.h])
 
+   dnl List of signals that are sent when an invalid virtual memory address
+   dnl is accessed, or when the stack overflows.
+   dnl Either { SIGSEGV } or { SIGSEGV, SIGBUS }.
+   case "$host_os" in
+     sunos4* | freebsd* | dragonfly* | openbsd* | netbsd* | kfreebsd* | knetbsd*) # BSD systems
+       FAULT_YIELDS_SIGBUS=1 ;;
+     hpux*) # HP-UX
+       FAULT_YIELDS_SIGBUS=1 ;;
+     macos* | darwin*) # MacOS X
+       FAULT_YIELDS_SIGBUS=1 ;;
+     gnu*) # Hurd
+       FAULT_YIELDS_SIGBUS=1 ;;
+     *)
+       FAULT_YIELDS_SIGBUS=0 ;;
+   esac
+   AC_DEFINE_UNQUOTED([FAULT_YIELDS_SIGBUS], [$FAULT_YIELDS_SIGBUS],
+     [Define to 1 if an invalid memory address access may yield a SIGBUS.])
+
    AC_CACHE_CHECK([for working C stack overflow detection],
      [ac_cv_sys_stack_overflow_works],
      [AC_TRY_RUN(
@@ -62,6 +81,10 @@
 	   sigemptyset (&act.sa_mask);
 	   act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
 	   act.sa_handler = segv_handler;
+	   #if FAULT_YIELDS_SIGBUS
+	   if (sigaction (SIGBUS, &act, 0) < 0)
+	     return -1;
+	   #endif
 	   return sigaction (SIGSEGV, &act, 0);
 	 }
 	 static volatile int *
@@ -244,6 +267,10 @@
 	   sigemptyset (&act.sa_mask);
 	   act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
 	   act.sa_sigaction = segv_handler;
+	   #if FAULT_YIELDS_SIGBUS
+	   if (sigaction (SIGBUS, &act, 0) < 0)
+	     return -1;
+	   #endif
 	   return sigaction (SIGSEGV, &act, 0);
 	 }
 	 static volatile int *