bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] c-stack: assume stack overflow if SA_SIGINFO unsupported


From: Eric Blake
Subject: [PATCH] c-stack: assume stack overflow if SA_SIGINFO unsupported
Date: Wed, 19 Jan 2011 10:15:16 -0700

* lib/c-stack.c (SIGACTION_WORKS): Rename...
(SIGINFO_WORKS): ...since gnulib module guarantees that (most) of
sigaction will work.
(die): Assume stack overflow if siginfo doesn't work, to let Haiku
behavior match Linux.
* tests/test-c-stack.c (main): Prefer NULL for pointers.

Signed-off-by: Eric Blake <address@hidden>
---

On Linux, if libsigsegv is not available, c-stack assumes stack
overflow for all segv.  But Haiku failed tests/test-c-stack.sh,
merely because the same assumption was not in place for platforms
that lack SA_SIGINFO.

[I still wish it were possible to make libsigsegv work on Haiku;
right now, it claims: libsigsegv: i586-pc-haiku | no | no | 2.9]

 ChangeLog            |    8 ++++++++
 lib/c-stack.c        |   16 +++++++++++-----
 tests/test-c-stack.c |    2 +-
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a9f6fb1..f01df0d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2011-01-19  Eric Blake  <address@hidden>

+       c-stack: assume stack overflow if SA_SIGINFO unsupported
+       * lib/c-stack.c (SIGACTION_WORKS): Rename...
+       (SIGINFO_WORKS): ...since gnulib module guarantees that (most) of
+       sigaction will work.
+       (die): Assume stack overflow if siginfo doesn't work, to let Haiku
+       behavior match Linux.
+       * tests/test-c-stack.c (main): Prefer NULL for pointers.
+
        stdbool-tests: accomodate Haiku
        * tests/test-stdbool.c: Haiku's gcc 2.95 lacks native _Bool.

diff --git a/lib/c-stack.c b/lib/c-stack.c
index 72790d7..bff346b 100644
--- a/lib/c-stack.c
+++ b/lib/c-stack.c
@@ -80,9 +80,9 @@ typedef struct sigaltstack stack_t;
 #include "ignore-value.h"

 #if defined SA_ONSTACK && defined SA_SIGINFO
-# define SIGACTION_WORKS 1
+# define SIGINFO_WORKS 1
 #else
-# define SIGACTION_WORKS 0
+# define SIGINFO_WORKS 0
 # ifndef SA_ONSTACK
 #  define SA_ONSTACK 0
 # endif
@@ -109,6 +109,12 @@ static void
 die (int signo)
 {
   char const *message;
+#if !SIGINFO_WORKS
+  /* 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.  */
+  signo = 0;
+#endif /* !SIGINFO_WORKS */
   segv_action (signo);
   message = signo ? program_error_message : stack_overflow_message;
   ignore_value (write (STDERR_FILENO, program_name, strlen (program_name)));
@@ -223,7 +229,7 @@ c_stack_action (void (*action) (int))
 # if STACK_DIRECTION
 #  define find_stack_direction(ptr) STACK_DIRECTION
 # else
-#  if ! SIGACTION_WORKS || HAVE_XSI_STACK_OVERFLOW_HEURISTIC
+#  if ! SIGINFO_WORKS || HAVE_XSI_STACK_OVERFLOW_HEURISTIC
 static int
 find_stack_direction (char const *addr)
 {
@@ -233,7 +239,7 @@ find_stack_direction (char const *addr)
 #  endif
 # endif

-# if SIGACTION_WORKS
+# if SIGINFO_WORKS

 /* Handle a segmentation violation and exit.  This function is
    async-signal-safe.  */
@@ -316,7 +322,7 @@ c_stack_action (void (*action) (int))

   sigemptyset (&act.sa_mask);

-# if SIGACTION_WORKS
+# if SIGINFO_WORKS
   /* POSIX 1003.1-2001 says SA_RESETHAND implies SA_NODEFER, but
      this is not true on Solaris 8 at least.  It doesn't hurt to use
      SA_NODEFER here, so leave it in.  */
diff --git a/tests/test-c-stack.c b/tests/test-c-stack.c
index 6454e34..cc27b43 100644
--- a/tests/test-c-stack.c
+++ b/tests/test-c-stack.c
@@ -61,7 +61,7 @@ main (int argc, char **argv)
 #endif

   program_name = argv[0];
-  if (c_stack_action (0) == 0)
+  if (c_stack_action (NULL) == 0)
     {
       if (1 < argc)
         {
-- 
1.7.3.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]