On Tue, Sep 02, 2008 at 01:20:43PM -0600, Eric Blake wrote:
> Which means I think we have isolated the bug to the recurse function.
> Gnulib's version must be doing something that actually manages to recurse
> with p == 0 in the final stack frame, then segv's dereferencing NULL
> rather than triggering stack overflow:
>
<snip recurse functions>
> I wonder if switching to libsigsegv's version will solve it.
>
After a bit of fidling I can say that it won't.
I replaced the recurse function in the m4 conftest with the ones from
libsigsegv and it still dumps core.
I've spent some time staring at m4s c-stack conftest program and a
similar one from libsigsegv and after some trial and error I've isolated
a change which will cause the m4 c-stack conftest to run succesfully.
--- conftest-1.c 2008-09-02 16:42:49.000000000 +0200
+++ conftest-3.c 2008-09-07 12:12:32.630000000 +0200
@@ -74,13 +74,14 @@
static int
c_stack_action ()
{
+ char mystack[SIGSTKSZ];
stack_t st;
struct sigaction act;
int r;
st.ss_flags = 0;
- st.ss_sp = alternate_signal_stack.buffer;
- st.ss_size = sizeof alternate_signal_stack.buffer;
+ st.ss_sp = mystack;
+ st.ss_size = sizeof (mystack);
r = sigaltstack (&st, 0);
if (r != 0)
return r;
$ cc -woff 728 -o conftest-3 -g conftest-3.c
$ ./conftest-3
$ echo $?
0
$
Apparently using a union to define the alternate stack like c-stack does
has some issues.
Looking briefly at libsigsegv it seems to never use the union style but
instead always uses a definition similar to the above.
-tgc