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
m4-2026-06-22-logs.tar.xz
Description: application/xz-compressed-tar
