Testing a diffutils snapshot on GNU/Hurd, I see two test failures: FAIL: test-sigsegv-catch-stackoverflow1 =======================================
*** longjmp causes uninitialized stack frame ***: terminated FAIL test-sigsegv-catch-stackoverflow1 (exit status: 134) FAIL: test-sigsegv-catch-stackoverflow2 ======================================= *** longjmp causes uninitialized stack frame ***: terminated FAIL test-sigsegv-catch-stackoverflow2 (exit status: 134) This is triggered by the _FORTIFY_SOURCE=2 setting in diffutils/configure.ac. This patch documents the bug and adds a workaround. 2025-01-05 Bruno Haible <br...@clisp.org> sigsegv tests: Work around a longjmp bug on GNU/Hurd. * tests/test-sigsegv-catch-stackoverflow1.c (_FORTIFY_SOURCE, __USE_FORTIFY_LEVEL): Undefine, as a workaround to the Hurd longjmp bug. * tests/test-sigsegv-catch-stackoverflow2.c (_FORTIFY_SOURCE, __USE_FORTIFY_LEVEL): Likewise. * doc/posix-functions/longjmp.texi: Document the Hurd bug. diff --git a/doc/posix-functions/longjmp.texi b/doc/posix-functions/longjmp.texi index 057d0ab83f..b6163c9dc5 100644 --- a/doc/posix-functions/longjmp.texi +++ b/doc/posix-functions/longjmp.texi @@ -18,7 +18,13 @@ the contents of stack-allocated variables. @item When longjumping out of a signal handler that was being executed on an -alternate stack (installed through @code{sigaltstack}), on FreeBSD, NetBSD, -OpenBSD, you need to clear the @code{SS_ONSTACK} flag in the @code{stack_t} +alternate stack (installed through @code{sigaltstack}), +on Hurd, FreeBSD, NetBSD, OpenBSD, +you need to clear the @code{SS_ONSTACK} flag in the @code{stack_t} structure managed by the kernel. +@item +This function may crash when the invoker code was compiled with option +@code{-D_FORTIFY_SOURCE=2}, +@c https://sourceware.org/bugzilla/show_bug.cgi?id=32522 +on Hurd. @end itemize diff --git a/tests/test-sigsegv-catch-stackoverflow1.c b/tests/test-sigsegv-catch-stackoverflow1.c index 093eb50e5f..cb20bceb8e 100644 --- a/tests/test-sigsegv-catch-stackoverflow1.c +++ b/tests/test-sigsegv-catch-stackoverflow1.c @@ -18,6 +18,14 @@ #include <config.h> +/* On GNU/Hurd, when compiling with -D_FORTIFY_SOURCE=2, avoid an error + "*** longjmp causes uninitialized stack frame ***: terminated". + Cf. <https://sourceware.org/bugzilla/show_bug.cgi?id=32522> */ +#ifdef __GNU__ +# undef _FORTIFY_SOURCE +# undef __USE_FORTIFY_LEVEL +#endif + /* Specification. */ #include "sigsegv.h" diff --git a/tests/test-sigsegv-catch-stackoverflow2.c b/tests/test-sigsegv-catch-stackoverflow2.c index f88bfb4e39..34ea491740 100644 --- a/tests/test-sigsegv-catch-stackoverflow2.c +++ b/tests/test-sigsegv-catch-stackoverflow2.c @@ -18,6 +18,14 @@ #include <config.h> +/* On GNU/Hurd, when compiling with -D_FORTIFY_SOURCE=2, avoid an error + "*** longjmp causes uninitialized stack frame ***: terminated". + Cf. <https://sourceware.org/bugzilla/show_bug.cgi?id=32522> */ +#ifdef __GNU__ +# undef _FORTIFY_SOURCE +# undef __USE_FORTIFY_LEVEL +#endif + /* Specification. */ #include "sigsegv.h"