changeset 11077:ddb65537c2d0

On HP-UX, don't pretend it was a SIGSEGV when it was a stack overflow.
author Bruno Haible <bruno@clisp.org>
date Sat, 24 Jan 2009 14:05:48 +0100
parents 990226176856
children 6113cefa040d
files ChangeLog lib/c-stack.c
diffstat 2 files changed, 20 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-01-24  Bruno Haible  <bruno@clisp.org>
+
+	* lib/c-stack.c (segv_handler): If !HAVE_XSI_STACK_OVERFLOW_HEURISTIC,
+	set signo = 0 also if info->si_code <= 0. Needed on HP-UX 11.11.
+	Reported by Gary V. Vaughan <gary@gnu.org>.
+
 2009-01-24  Bruno Haible  <bruno@clisp.org>
 
 	* lib/c-strtod.h (c_strtod, c_strtold): Add specification.
--- a/lib/c-stack.c
+++ b/lib/c-stack.c
@@ -239,21 +239,21 @@
 	      void *context __attribute__ ((unused)))
 {
   /* Clear SIGNO if it seems to have been a stack overflow.  */
+#  if ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC
+  /* We can't easily determine whether it is a stack overflow; so
+     assume that the rest of our program is perfect (!) and that
+     this segmentation violation is a stack overflow.
+
+     Note that although both Linux and Solaris provide
+     sigaltstack, SA_ONSTACK, and SA_SIGINFO, currently only
+     Solaris satisfies the XSI heueristic.  This is because
+     Solaris populates uc_stack with the details of the
+     interrupted stack, while Linux populates it with the details
+     of the current stack.  */
+  signo = 0;
+#  else
   if (0 < info->si_code)
     {
-#  if ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC
-      /* We can't easily determine whether it is a stack overflow; so
-	 assume that the rest of our program is perfect (!) and that
-	 this segmentation violation is a stack overflow.
-
-	 Note that although both Linux and Solaris provide
-	 sigaltstack, SA_ONSTACK, and SA_SIGINFO, currently only
-	 Solaris satisfies the XSI heueristic.  This is because
-	 Solaris populates uc_stack with the details of the
-	 interrupted stack, while Linux populates it with the details
-	 of the current stack.  */
-      signo = 0;
-#  else
       /* If the faulting address is within the stack, or within one
 	 page of the stack end, assume that it is a stack
 	 overflow.  */
@@ -278,8 +278,8 @@
 	write (STDERR_FILENO, buf, strlen (buf));
       }
 #   endif
+    }
 #  endif
-    }
 
   die (signo);
 }