Gary V. Vaughan wrote: > hppa2.0w-hp-hpux11.11-hpc1111 m4 tests pass, gnulib fails: test-c-stack.sh > ./test-c-stack.sh[7]: 1752 Memory fault(coredump) > FAIL: test-c-stack.sh
I reproduce this on HP-UX 11.11, without libsigsegv. $ ./test-c-stack ./test-c-stack: program error Segmentation fault (core dumped) The situation on HP-UX 11.11 is that HAVE_XSI_STACK_OVERFLOW_HEURISTIC is not defined. This is correct: there are two problems with the system here: 1) info->si_code is zero, not a positive number as expected by Paul's code. 2) the mcontext's uc_stack.ss_size field is unusable. Breakpoint 1, segv_handler (signo=11, info=0x400017a8, context=0x400012d0) at c-stack.c:244 244 if (0 < info->si_code) (gdb) print *info $1 = {si_signo = 11, si_code = 0, si_errno = 0, si_value = {__svi_int_s = { __svi_int = 0}, __sival_ptr = 0x0}, __data = {__proc = { __pid = 2047868944, __pdata = {__kill = {__uid = 0}, __SIGCLD = { __status = 0}}}, __fault = {__addr = 0x7a100010}, __file = { __fd = 2047868944, __band = 0}, __gfault = {__addr = 0x7a100010, __lockpage = 0x0, __dev_id = 0}}, __pad = {0, 0, 0, 0, 0, 0, 0, 0, 0}} Stack grows, previous stack values are ...0x7a0ffe6c...0x7a0fff6c Stack apparently ends at 0x7a100000 Failure address 0x7a100010 is plausible. si_code is 0 - unusual but acceptable. But uc_stack = {ss_sp = 0x7a001100, ss_flags = 0, ss_size = 4352} which is unusable. I'm committing the change below. With it, the test passes: PASS: test-c-stack.sh cannot tell stack overflow from crash; consider installing libsigsegv SKIP: test-c-stack2.sh 2009-01-24 Bruno Haible <br...@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 <g...@gnu.org>. *** lib/c-stack.c.orig 2009-01-24 14:02:12.000000000 +0100 --- lib/c-stack.c 2009-01-24 13:54:39.000000000 +0100 *************** *** 239,259 **** void *context __attribute__ ((unused))) { /* Clear SIGNO if it seems to have been a stack overflow. */ - 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. */ --- 239,259 ---- 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 the faulting address is within the stack, or within one page of the stack end, assume that it is a stack overflow. */ *************** *** 278,285 **** write (STDERR_FILENO, buf, strlen (buf)); } # endif - # endif } die (signo); } --- 278,285 ---- write (STDERR_FILENO, buf, strlen (buf)); } # endif } + # endif die (signo); }