Re: [PATCH] alpha: Fix fts and fts64 ABI mismatch

Adhemerval Zanella Netto <[email protected]> Tue, 4 Aug 2026 10:50:44 -0300
Newsgroups gmane.comp.lib.glibc.alpha
Organization Linaro
Message-ID <[email protected]>

On 03/08/26 16:01, Magnus Lindholm wrote:
> Alpha has matching off_t and off64_t types, but ino_t and ino64_t
> differ.  Consequently, FTSENT and FTSENT64 have different layouts, and
> the fts and fts64 interfaces cannot share one implementation.
> 
> The generic 64-bit-word-size implementation assumes that matching
> offset types are sufficient to alias the two interfaces.  On Alpha,
> this causes the ordinary fts interface to operate on the incompatible
> FTSENT64 layout, corrupting traversal state.
> 
> Only share the implementations when both the offset and inode types
> match.  Add Alpha sysdeps wrappers so that separate fts and fts64
> implementations are built.

It is not clear to me why you need alpha-specific one after
b9a2dea54abd1c5db9773a92c97dd3202bbaec62.

> 
> The Alpha sysdeps wrapper files are based on a downstream patch written
> by Aurelien Jarno in 2016 and carried by Debian since then.
> 
> This fixes io/tst-fts, io/tst-fts-bz22944, and
> io/tst-fts-newflags on Alpha.
> 
> Signed-off-by: Magnus Lindholm <[email protected]>
> ---
>  io/fts.c                              | 3 ++-
>  io/fts64.c                            | 3 ++-
>  sysdeps/unix/sysv/linux/alpha/fts.c   | 1 +
>  sysdeps/unix/sysv/linux/alpha/fts64.c | 1 +
>  4 files changed, 6 insertions(+), 2 deletions(-)
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/fts.c
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/fts64.c
> 
> diff --git a/io/fts.c b/io/fts.c
> index d3b8e5a100..c7df552b83 100644
> --- a/io/fts.c
> +++ b/io/fts.c
> @@ -18,6 +18,7 @@
>  
>  #include <sys/types.h>
>  
> -#ifndef __OFF_T_MATCHES_OFF64_T
> +#if !defined __OFF_T_MATCHES_OFF64_T \
> +    || !defined __INO_T_MATCHES_INO64_T
>  # include "io/fts-common.c"
>  #endif
> diff --git a/io/fts64.c b/io/fts64.c
> index 1efa06ab3b..c2cf45523e 100644
> --- a/io/fts64.c
> +++ b/io/fts64.c
> @@ -50,7 +50,8 @@ weak_alias (__fts64_read, fts64_read)
>  weak_alias (__fts64_set, fts64_set)
>  weak_alias (__fts64_children, fts64_children)
>  
> -#ifdef __OFF_T_MATCHES_OFF64_T
> +#if defined __OFF_T_MATCHES_OFF64_T \
> +    && defined __INO_T_MATCHES_INO64_T
>  weak_alias (__fts64_open, fts_open)
>  weak_alias (__fts64_close, fts_close)
>  weak_alias (__fts64_read, fts_read)
> diff --git a/sysdeps/unix/sysv/linux/alpha/fts.c b/sysdeps/unix/sysv/linux/alpha/fts.c
> new file mode 100644
> index 0000000000..d0c62e6195
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/fts.c
> @@ -0,0 +1 @@
> +#include <io/fts.c>
> diff --git a/sysdeps/unix/sysv/linux/alpha/fts64.c b/sysdeps/unix/sysv/linux/alpha/fts64.c
> new file mode 100644
> index 0000000000..2472f8bf75
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/fts64.c
> @@ -0,0 +1 @@
> +#include <io/fts64.c>