Hi,

On 2026-02-23 13:44, Emanuele Rocca wrote:
> Source: patch
> Version: 2.8-2
> Severity: important
> Tags: ftbfs upstream
> Justification: fails to build from source
> User: [email protected]
> Usertags: glibc-2.43
> 
> Hi,
> 
> patch fails to build from source on arm64 when using glibc 2.43,
> currently in experimental.
> 
> The issue is triggered by glibc 2.43 on arm64 enabling 2MB THP by
> default:
> https://sourceware.org/git/?p=glibc.git;a=commit;h=321e1fc73f53081d92ba357cdd48c56b79292020
> 
> The problem is however not architecture-specific. For example it can be
> reproduced with glibc 2.42 on amd64 by building the package with the
> GLIBC_TUNABLES environment variable set to glibc.malloc.hugetlb=2.
> 
> Successful build with glibc 2.42, currently in sid:
> https://people.debian.org/~ema/glibc-2.43-rebuilds/output-2/patch_arm64.build
> 
> Logs of a failed build with glibc 2.43 are here:
> https://people.debian.org/~ema/glibc-2.43-rebuilds/output-1/patch_arm64.build
> 
> Salient part:
> 
> FAIL: bad-filenames
> ===================
> 
> [27] emit_patch ../z | patch -f -p1 --dry-run || echo status: $? -- ok
> [31] emit_patch /absolute/path | patch -f -p0 --dry-run || echo status: $? -- 
> ok
> [52] emit_patch $filename | (cd / && patch -f -p0 --dry-run) || echo status: 
> $? -- ok
> [56] emit_patch a/../z | patch -f -p0 --dry-run || echo status: $? -- ok
> [70] emit_patch a/../z | patch -f -p1 --dry-run || echo status: $? -- ok
> [84] emit_patch ../z | patch -f -p0 --dry-run || echo status: $? -- ok
> [106] patch -f -p0 --dry-run < d.diff || echo status: $? -- ok
> [120] patch -f -p0 --dry-run < d.diff || echo status: $? -- ok
> [125] patch -f -p1 --dry-run < d.diff || echo status: $? -- ok
> [134] 
>     emit_patch '"a\nb"' | patch   >patch.out 2>&1
>     status=$?
>     sed "$fixup" patch.out
>     echo status: $status
>    -- ok
> [134] 
>     emit_patch 'foo' | patch 'a
> b'  >patch.out 2>&1
>     status=$?
>     sed "$fixup" patch.out
>     echo status: $status
>    -- ok
> [134] 
>     emit_patch 'foo' | patch '-o' 'a
> b' >patch.out 2>&1
>     status=$?
>     sed "$fixup" patch.out
>     echo status: $status
>    -- ok
> [175] emit_patch_with_NUL | patch; echo status: $? -- ok
> [190] patch -f -p0 < d.diff || echo status: $? -- ok
> [206] emit_patch f | patch -r- "" || echo status: $? -- FAILED
> --- expected
> +++ got
> @@ -1,3 +1,3 @@
> -File '' is not a regular file -- refusing to patch
> -1 out of 1 hunk ignored
> -status: 1
> +patching file ''
> +/build/reproducible-path/patch-2.8/src/patch: **** Can't rename file 
> .o3yWHeL to '' : No such file or directory
> +status: 2
> 15 tests (14 passed, 1 failed)
> FAIL bad-filenames (exit status: 1)

The issue is that the recent upstream change backported into 
reject_empty_filenames.patch change safe_xstat() to return EINVAL in 
case of an empty filename, but also assumes that errno is 0, so that the 
error is later masked in stat_file(), returning 0 in that case. The 
malloc() code change in glibc 2.43 can set in some conditions errno to 
ENOENT even if the memory allocation is successful.

The patch below fixes that, although it should be checked by someone 
with a deeper knowledge of the code. Intuitively I would have actually 
set errno to EINVAL and changed the return to -1, but then that breaks 
the testsuite the same way all the time, as stat_file() doesn't mask it 
anymore.

diff --git a/src/safe.c b/src/safe.c
index 065c13b..9ce2ee7 100644
--- a/src/safe.c
+++ b/src/safe.c
@@ -572,7 +572,10 @@ safe_xstat (char *pathname, struct stat *buf, int flags)
   if (dirfd == DIRFD_INVALID)
     return -1;
   if (! strcmp (pathname, ""))
-    return EINVAL;
+    {
+      errno = 0;
+      return EINVAL;
+    }
   return fstatat (dirfd, pathname, buf, flags);
 }

Regards
Aurelien

-- 
Aurelien Jarno                          GPG: 4096R/1DDD8C9B
[email protected]                     http://aurel32.net

Reply via email to