From: Bruno Haible Date: Sun, 7 Apr 2024 14:53:02 +0000 (+0200) Subject: sigsegv tests: Avoid a crash on NetBSD 10.0/i386. X-Git-Tag: v1.0~151 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=95f52c5d1bb5499e695b2e77a6385bdff4e7c46b;p=thirdparty%2Fgnulib.git sigsegv tests: Avoid a crash on NetBSD 10.0/i386. * tests/test-sigsegv-catch-stackoverflow1.c (stackoverflow_handler_continuation): On NetBSD/i386, align the stack pointer before calling longjmp. --- diff --git a/ChangeLog b/ChangeLog index e6c2b5cd20..e9054029a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2024-04-07 Bruno Haible + + sigsegv tests: Avoid a crash on NetBSD 10.0/i386. + * tests/test-sigsegv-catch-stackoverflow1.c + (stackoverflow_handler_continuation): On NetBSD/i386, align the stack + pointer before calling longjmp. + 2024-04-07 Bruno Haible gnulib-tool.py: Add comment. diff --git a/tests/test-sigsegv-catch-stackoverflow1.c b/tests/test-sigsegv-catch-stackoverflow1.c index 20915adfd5..46b120686c 100644 --- a/tests/test-sigsegv-catch-stackoverflow1.c +++ b/tests/test-sigsegv-catch-stackoverflow1.c @@ -55,7 +55,26 @@ static volatile char *stack_upper_bound; static void stackoverflow_handler_continuation (void *arg1, void *arg2, void *arg3) { +#if defined __NetBSD__ && defined __i386__ + /* On NetBSD 10.0/i386, when built as part of a testdir-all (but not as part + of a testdir for just the module 'sigsegv'!) this program crashes. The + cause is that: + - The alternate stack is not aligned (which is intentional, see + altstack-util.h) and NetBSD does not align the stack pointer while + switching to the alternate stack. + - When %esp is not aligned, the dynamic linker crashes in function + _rtld_bind while resolving the symbol 'longjmp'. + We would around this by aligning the stack pointer, to a multiple of 8. */ + int *argp; + __asm__ __volatile__ ("movl %1,%0" : "=r" (argp) : "r" (&arg1)); + unsigned long sp; + __asm__ __volatile__ ("movl %%esp,%0" : "=r" (sp)); + sp &= ~7UL; + __asm__ __volatile__ ("movl %0,%%esp" : : "r" (sp)); + int arg = *argp; +#else int arg = (int) (long) arg1; +#endif longjmp (mainloop, arg); }