[Top][All Lists]
[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
- [PATCH] c-stack: assume stack overflow if SA_SIGINFO unsupported,
Eric Blake <=