Hi Paul,

> > FAIL: test-fstatat
> > ==================
> > 
> > Segmentation fault (core dumped)
> > FAIL test-fstatat (exit status: 139)
> > 
> > 
> > I reproduce it in Alpine Linux 3.24.1 (but not in 3.22 nor 3.20).
> 
> Thanks for the bug report. Unfortunately portal.cfarm.net lists only 
> Alpine 3.22 and 3.23.
> 
> Was this a crosscompile, or native? Was it x86-64 or some other 
> platform?

It was a native compilation on x86_64. Based on this Alpine Linux image:
https://dl-cdn.alpinelinux.org/alpine/v3.24/releases/x86_64/alpine-standard-3.24.1-x86_64.iso

> Is the build log public?

I'm attaching the logs (from my VM).

> > The backtrace is:
> >    test-fstatat.c:111
> >      -> musl/src/stat/fstatat.c:147
> >         -> musl/src/stat/fstatat.c:81
> > 
> > That line reads:
> >          if (flag==AT_EMPTY_PATH && fd>=0 && !*path) {
> 
> The backtrace suggests that REPLACE_FSTATAT was 0, because there is no 
> rentry for Gnulib's lib/fstatat.c.

Yes, REPLACE_FSTATAT was 0. (Looking in config.status.)

> However, REPLACE_FSTATAT should have 
> been 1 because the musl source code doesn't support AT_EMPTY_PATH with a 
> null pointer .
> 
> Can you verify whether fstatat is being replaced by checking that 
> m4/lib/sys/stat.h contains lines like the following?
> 
>    #if 1
>    # if 1
>    #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
>    #   undef fstatat
>    #   define fstatat rpl_fstatat
>    #  endif
>    _GL_FUNCDECL_RPL (fstatat, int,

No, it is like this:

    #if 1
    # if 0
    #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    #   undef fstatat
    #   define fstatat rpl_fstatat
    #  endif
    _GL_FUNCDECL_RPL (fstatat, int,

> Can you look in config.log for lines like the following?
> 
>    ... checking whether fstatat+AT_EMPTY_PATH allows null file
>    ...
>    ... result: yes

Yes, config.log contains this. The 'conftest' program terminated with status 0.

> What happens when you compile and run the following program? What's the 
> tail of "strace ./a.out"? (This is the program 'configure' should be 
> running to see whether AT_EMPTY_PATH works with a null pointer.)
> 
>    #include <stddef.h>
>    #include <fcntl.h>
>    #include <sys/stat.h>
>    #ifndef AT_EMPTY_PATH
>    # define AT_EMPTY_PATH 0
>    #endif
>    #if __GLIBC__ && ! (2 < __GLIBC__ + (41 <= __GLIBC_MINOR__))
>     #error "glibc 2.40 and earlier can fail with null file"
>    #endif
> 
>    int
>    main (void)
>    {
>      struct stat st;
>      return
>        (AT_EMPTY_PATH
>         && fstatat (AT_FDCWD, NULL, &st, AT_EMPTY_PATH) < 0);
>    }

The tail of "strace ./a.out" is:

newfstatat(AT_FDCWD, NULL, {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}, 
AT_EMPTY_PATH) = 0
exit_group(0)                           = ?
+++ exited with 0 +++

The tail of "ltrace ./a.out" is:

fstatat(0xffffff9c, 0, 0x7ffe8d831860, 4096)                                    
                   = 0
+++ exited (status 0) +++

The reason is that in this test program you pass fd = AT_FDCWD.
However, the crash in musl libc occurs only if fd>=0.

> What is the output of the shell command 'nm -g lib/libm4_a-fstatat.o'?

This file does not exist, because REPLACE_FSTATAT was 0.

Bruno

Attachment: m4-2026-06-22-logs.tar.xz
Description: application/xz-compressed-tar

Reply via email to