On 2026-06-25 03:27, Bruno Haible wrote:
The reason is that in this test program you pass fd = AT_FDCWD.
However, the crash in musl libc occurs only if fd>=0.

Oh! The light dawns. I installed the attached patch to Gnulib and propagated it into GNU m4. The next CI run for m4 should test it.

Thanks.
From 3096dd735de70c4ba7b1a5210a1c9cde0ed3204d Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Thu, 25 Jun 2026 08:27:36 -0700
Subject: [PATCH] fstatat: port null file support to Alpine 3.24

Problem reported by Bruno Haible in:
https://lists.gnu.org/r/bug-gnulib/2026-06/msg00093.html
* m4/fstatat.m4 (gl_FUNC_FSTATAT): When checking for
support for a null pointer file, check nonnegative directory
file descriptors as well as AT_FDCWD.
---
 ChangeLog     |  9 +++++++++
 m4/fstatat.m4 | 15 ++++++++++-----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index bf8784efa9..e0328ee95f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2026-06-25  Paul Eggert  <[email protected]>
+
+	fstatat: port null file support to Alpine 3.24
+	Problem reported by Bruno Haible in:
+	https://lists.gnu.org/r/bug-gnulib/2026-06/msg00093.html
+	* m4/fstatat.m4 (gl_FUNC_FSTATAT): When checking for
+	support for a null pointer file, check nonnegative directory
+	file descriptors as well as AT_FDCWD.
+
 2026-06-25  Bruno Haible  <[email protected]>
 
 	manywarnings: Fix for compilers that are named '$host-gcc'.
diff --git a/m4/fstatat.m4 b/m4/fstatat.m4
index b706c891a4..34a1638e9b 100644
--- a/m4/fstatat.m4
+++ b/m4/fstatat.m4
@@ -1,5 +1,5 @@
 # fstatat.m4
-# serial 7
+# serial 8
 dnl Copyright (C) 2004-2026 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -68,7 +68,7 @@ AC_DEFUN([gl_FUNC_FSTATAT],
     dnl is not present, and it is not worth the trouble to tune this.
     AS_CASE([$REPLACE_FSTATAT],
       [0],
-        [AC_CACHE_CHECK([whether fstatat+AT_EMPTY_PATH allows null file],
+        [AC_CACHE_CHECK([for no AT_EMPTY_PATH or fstatat with null file],
            [gl_cv_func_fstatat_null_file],
            [AC_RUN_IFELSE(
               [AC_LANG_PROGRAM(
@@ -85,9 +85,14 @@ AC_DEFUN([gl_FUNC_FSTATAT],
                    #endif
                  ]],
                  [[struct stat st;
-                   return
-                     (AT_EMPTY_PATH
-                      && fstatat (AT_FDCWD, NULL, &st, AT_EMPTY_PATH) < 0);
+                   if (!AT_EMPTY_PATH)
+                     return 0; /* No need to replace fstatat.  */
+                   if (fstatat (AT_FDCWD, NULL, &st, AT_EMPTY_PATH) < 0)
+                     return 1;
+                   int fd = open (".", O_RDONLY);
+                   if (fd < 0)
+                     return 1; /* Play it safe.  */
+                   return fstatat (fd, NULL, &st, AT_EMPTY_PATH) < 0;
                  ]])],
               [gl_cv_func_fstatat_null_file=yes],
               [gl_cv_func_fstatat_null_file=no],
-- 
2.53.0

Reply via email to