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"
 




Reply via email to