[glibc] io: fix ftw ABI on MIPS n64

Adhemerval Zanella via Glibc-cvs <[email protected]> Mon, 3 Aug 2026 19:14:53 +0000 (GMT)
Newsgroups gmane.comp.lib.glibc.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=6758def717175e679cb49b5051b6b5ec54ddfb2c

commit 6758def717175e679cb49b5051b6b5ec54ddfb2c
Author: Xi Ruoyao <[email protected]>
Date:   Wed Jul 22 19:26:10 2026 +0800

    io: fix ftw ABI on MIPS n64
    
    On MIPS n64 off_t is same as off64_t, but struct stat is not same as
    struct stat64 (very peculiar but see the "as tempting as it..." comment
    in linux/mips/kernel_stat.h).  As the ftw/ftw64 callback accepts a
    pointer to a function who accepts struct stat/stat64, for MIPS n64 we
    must use different implementations for ftw and ftw64.
    
    Thus for testing if ftw64 can be aliased to ftw, we should check
    XSTAT_IS_XSTAT64 instead of __OFF_T_MATCHES_OFF64_T.
    
    This resolves the io/tst-ftw-lnk failure observed on MIPS n64.
    
    Link: https://sourceware.org/glibc/wiki/Testing/Tests/io/tst-ftw-lnk
    Signed-off-by: Xi Ruoyao <[email protected]>
    Reviewed-by: Adhemerval Zanella  <[email protected]>

Diff:
---
 io/ftw.c   | 4 +++-
 io/ftw64.c | 5 ++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/io/ftw.c b/io/ftw.c
index ed0eeb3904..a9368a706e 100644
--- a/io/ftw.c
+++ b/io/ftw.c
@@ -18,7 +18,9 @@
 
 #include <sys/types.h>
 
-#ifndef __OFF_T_MATCHES_OFF64_T
+#include <kernel_stat.h>
+
+#if !XSTAT_IS_XSTAT64
 # include "ftw-common.c"
 
 versioned_symbol (libc, __new_nftw, nftw, GLIBC_2_3_3);
diff --git a/io/ftw64.c b/io/ftw64.c
index d3cd14c21a..fa7b05df22 100644
--- a/io/ftw64.c
+++ b/io/ftw64.c
@@ -31,6 +31,9 @@
 #define ftw __rename_ftw
 #define nftw __rename_nftw
 
+#include <sys/types.h>
+
+#include <kernel_stat.h>
 #include <shlib-compat.h>
 #include "ftw-common.c"
 
@@ -44,7 +47,7 @@ versioned_symbol (libc, __new_nftw64, nftw64, GLIBC_2_3_3);
 compat_symbol (libc, __old_nftw64, nftw64, GLIBC_2_1);
 #endif
 
-#ifdef __OFF_T_MATCHES_OFF64_T
+#if XSTAT_IS_XSTAT64
 weak_alias (__ftw64, ftw)
 versioned_symbol (libc, __new_nftw64, nftw, GLIBC_2_3_3);
 # if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_3_3)