# HG changeset patch # User Eric Blake # Date 1295457132 25200 # Node ID 3cb76305b3e92652729ba4528ded77a40f40de57 # Parent bbf9bddcef7d76c63d0c6dffcfa4723593f5564f 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. Signed-off-by: Eric Blake diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2011-01-19 Eric Blake + 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 --- a/lib/c-stack.c +++ b/lib/c-stack.c @@ -80,9 +80,9 @@ #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 @@ 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 @@ # 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 @@ # endif # endif -# if SIGACTION_WORKS +# if SIGINFO_WORKS /* Handle a segmentation violation and exit. This function is async-signal-safe. */ @@ -316,7 +322,7 @@ 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 --- a/tests/test-c-stack.c +++ b/tests/test-c-stack.c @@ -61,7 +61,7 @@ #endif program_name = argv[0]; - if (c_stack_action (0) == 0) + if (c_stack_action (NULL) == 0) { if (1 < argc) {