[PATCH v2] io: fix ftw ABI on MIPS n64

Xi Ruoyao <[email protected]>
Newsgroups gmane.comp.lib.glibc.alpha
Message-ID <[email protected]>
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]>
---

Tested on x86_64-linux and mips64-linux.  No new failures were found,
and the aliasing of ftw ftw64 is as expected.  On x86_64:

$ objdump -t libc.so.6 | grep ' ftw(64)?$' -E
00000000001094e0  w    F .text	000000000000000f              ftw
00000000001094e0  w    F .text	000000000000000f              ftw64

On mips64:
$ objdump -t libc.so.6 | grep ' ftw(64)?$' -E
000000000013a908 g     F .text	0000000000000028              ftw
000000000013bff0  w    F .text	0000000000000028              ftw64

 io/ftw.c   | 4 ++--
 io/ftw64.c | 3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/io/ftw.c b/io/ftw.c
index ed0eeb3904..c759701372 100644
--- a/io/ftw.c
+++ b/io/ftw.c
@@ -16,9 +16,9 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <sys/types.h>
+#include <kernel_stat.h>
 
-#ifndef __OFF_T_MATCHES_OFF64_T
+#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..fc36f97e7e 100644
--- a/io/ftw64.c
+++ b/io/ftw64.c
@@ -31,6 +31,7 @@
 #define ftw __rename_ftw
 #define nftw __rename_nftw
 
+#include <kernel_stat.h>
 #include <shlib-compat.h>
 #include "ftw-common.c"
 
@@ -44,7 +45,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)
-- 
2.55.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.