• Bug#1105170: unblock: glibc/2.41-8 (1/3)

    From Sebastian Ramacher@21:1/5 to Aurelien Jarno on Wed May 14 18:10:01 2025
    XPost: linux.debian.maint.boot, linux.debian.devel.release

    Control: tags -1 confirmed

    On 2025-05-12 20:07:15 +0200, Aurelien Jarno wrote:
    Package: release.debian.org
    Severity: normal
    X-Debbugs-Cc: glibc@packages.debian.org
    Control: affects -1 + src:glibc
    User: release.debian.org@packages.debian.org
    Usertags: unblock

    Please pre-approve unblocking of package glibc/2.41-8

    ACK from RT. Adding d-boot for the d-i ACK. It might make sense to wait
    until after the next RC from d-i with the upload.

    Cheers


    [ Reason ]
    * The upstream stable branch got a few fixes since the last upload
    and this update pulls them into the debian package. From the
    changelog:

    - Fix elf/tst-audit10 test failure on x86 systems without AVX. Closes:
    #1103303.
    => This fixes an issue reported by the reproducible builds team,
    basically the testsuite doesn't run anymore on a host without
    AVX. This is relatively recent so it went unnoticed, and has been
    introduced by GCC changes. This comes with additional tests.

    - Fix pthread_getattr_np failure when executable stack tunable is set.
    => This fix an issue introduced with the recently added tunable
    option to make the stack executable. This issue has been reported
    upstream from a Debian system:
    https://sourceware.org/bugzilla/show_bug.cgi?id=32897

    * In addition to the upstream changes there is also a debconf
    translation update, and a small change to the debhelper.mk to fix the
    content of the NEWS.Debian.gz (#1104099).

    * Finally there are also some Hurd related changes, but they only
    touches code that is not built on Linux.

    [ Impact ]
    If the unblock isn't granted:
    - Users will get the wrong documentation to make the stack executable
    - Difference with the upstream stable branch will increase, which might
    make future updates more complicated (e.g. for a security fix).

    [ Tests ]
    The pthread_getattr_np changes comes with additional upstream tests.

    [ Risks ]
    I believe the risks are quite low, the changes only affect the ld.so
    binary, and the version number in the libc.so binary. Other binaries are
    bit to bit identical to the previous version. The changes to ld.so are
    only executed with GLIBC_TUNABLES=glibc.rtld.execstack=2.

    [ Checklist ]
    [x] all changes are documented in the d/changelog
    [x] I reviewed all changes and I approve them
    [x] attach debdiff against the package in testing

    [ Other info ]
    It took me some time to prepare this request, and in the meantime the
    d-i udeb freeze email arrived. I am fine with any ordering.

    unblock glibc/2.41-8

    diff --git a/debian/changelog b/debian/changelog
    index bbc1004d..fe504c81 100644
    --- a/debian/changelog
    +++ b/debian/changelog
    @@ -1,3 +1,34 @@
    +glibc (2.41-8) unstable; urgency=medium
    +
    + [ Samuel Thibault ]
    + * debian/testsuite-xfail-debian.mk: xfail tst-execstack-prog-static-tunable
    + on hurd-any. Drop duplicate unsupported stances commited uptream.
    + * debian/patches/hurd-i386/git-dup-refcnt.diff: Fix detecting too many dups.
    + * debian/patches/hurd-i386/git-xstate.diff: Fix restoring SSE state on
    + signals.
    + * debian/patches/hurd-i386/local-intr-msg-clobber.diff: Drop now-useless
    + patch.
    + * debian/patches/hurd-i386/git-utime-EINVAL.diff: Make *utime*s catch invalid
    + times.
    + * debian/patches/hurd-i386/git-xstate-initialized.diff: Fix crash in dash. + * debian/patches/hurd-i386/git-signal-fpe-exceptions.diff: Fix crash in FPE
    + handlers.
    + * debian/patches/hurd-i386/git-symlink-eexist.diff: Fix gnulib testsuite. +
    + [ Adriano Rafael Gomes ]
    + * Update Brazilian Portuguese debconf translation. Closes: #1103446.
    +
    + [ Aurelien Jarno ]
    + * debian/rules.d/debhelper.mk: do not replace LIBC in debhelper.in files. + This was used for lintian overrides, but it is not used anymore. Closes:
    + #1104099.
    + * debian/patches/git-updates.diff: update from upstream stable branch:
    + - Fix elf/tst-audit10 test failure on x86 systems without AVX. Closes: + #1103303.
    + - Fix pthread_getattr_np failure when executable stack tunable is set.
    +
    + -- Aurelien Jarno <aurel32@debian.org> Sat, 10 May 2025 12:45:57 +0200
    +
    glibc (2.41-7) unstable; urgency=medium

    [ Samuel Thibault ]
    diff --git a/debian/patches/git-updates.diff b/debian/patches/git-updates.diff
    index 80295b6a..ea94532b 100644
    --- a/debian/patches/git-updates.diff
    +++ b/debian/patches/git-updates.diff
    @@ -22,10 +22,10 @@ index d0108d2caa..aa547a443f 100644
    $(common-objdir):$(subst $(empty) ,:,$(patsubst ../$(subdir),.,$(rpath-dirs:%=$(common-objpfx)%)))
    else # build-static
    diff --git a/NEWS b/NEWS
    -index b11422b060..8740f5956a 100644
    +index b11422b060..51586aaad7 100644
    --- a/NEWS
    +++ b/NEWS
    -@@ -5,6 +5,28 @@ See the end for copying conditions.
    +@@ -5,6 +5,31 @@ See the end for copying conditions.
    Please send GNU C library bug reports via <https://sourceware.org/bugzilla/>
    using `glibc' in the "product" field.

    @@ -50,6 +50,9 @@ index b11422b060..8740f5956a 100644
    + [32782] nptl: Race conditions in pthread cancellation causing crash
    + [32786] nptl: PTHREAD_COND_INITIALIZER compatibility with pre-2.41 versions
    + [32810] Crash on x86-64 if XSAVEC disable via tunable
    ++ [32882] tst-audit10 fails with SIGILL on CPUs without AVX
    ++ [32897] dynamic-link: pthread_getattr_np fails when executable stack
    ++ tunable is set
    +
    Version 2.41

    @@ -986,7 +989,7 @@ index 4b1d0d8741..3a3ae56a24 100644
    $(objpfx)tst-piemod1.so: $(libsupport)
    diff --git a/elf/dl-execstack-tunable.c b/elf/dl-execstack-tunable.c
    new file mode 100644
    -index 0000000000..6cef1a3036
    +index 0000000000..e3b638aeaa
    --- /dev/null
    +++ b/elf/dl-execstack-tunable.c
    @@ -0,0 +1,39 @@
    @@ -1023,12 +1026,47 @@ index 0000000000..6cef1a3036
    + break;
    +
    + case stack_tunable_mode_force:
    -+ if (_dl_make_stack_executable (&__libc_stack_end) != 0)
    ++ if (_dl_make_stack_executable (__libc_stack_end) != 0)
    + _dl_fatal_printf (
    +"Fatal glibc error: cannot enable executable stack as tunable requires");
    + break;
    + }
    +}
    +diff --git a/elf/dl-execstack.c b/elf/dl-execstack.c
    +index e4d7dbe7f8..ceec5b2def 100644
    +--- a/elf/dl-execstack.c
    ++++ b/elf/dl-execstack.c
    +@@ -23,7 +23,7 @@
    + so as to mprotect it. */
    +
    + int
    +-_dl_make_stack_executable (void **stack_endp)
    ++_dl_make_stack_executable (const void *stack_endp)
    + {
    + return ENOSYS;
    + }
    +diff --git a/elf/dl-load.c b/elf/dl-load.c
    +index f905578a65..945dd8a231 100644
    +--- a/elf/dl-load.c
    ++++ b/elf/dl-load.c
    +@@ -945,7 +945,7 @@ struct link_map *
    + _dl_map_object_from_fd (const char *name, const char *origname, int fd,
    + struct filebuf *fbp, char *realname,
    + struct link_map *loader, int l_type, int mode,
    +- void **stack_endp, Lmid_t nsid)
    ++ const void *stack_endp, Lmid_t nsid)
    + {
    + struct link_map *l = NULL;
    + const ElfW(Ehdr) *header;
    +@@ -2180,7 +2180,7 @@ _dl_map_object (struct link_map *loader, const char *name,
    +
    + void *stack_end = __libc_stack_end;
    + return _dl_map_object_from_fd (name, origname, fd, &fb, realname, loader, +- type, mode, &stack_end, nsid);
    ++ type, mode, stack_end, nsid);
    + }
    +
    + struct add_path_state
    diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c
    index e34bf5f7ce..758bf9893e 100644
    --- a/elf/dl-reloc-static-pie.c
    @@ -2784,10 +2822,10 @@ index 0000000000..7fb40fdd9e
    +END (__memset_sve_zva64)
    +#endif
    diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
    -index e871f27ff2..4b44beb3f4 100644
    +index e871f27ff2..ddb34a1588 100644
    --- a/sysdeps/generic/ldsodefs.h
    +++ b/sysdeps/generic/ldsodefs.h
    -@@ -695,6 +695,19 @@ extern const ElfW(Phdr) *_dl_phdr;
    +@@ -695,10 +695,23 @@ extern const ElfW(Phdr) *_dl_phdr;
    extern size_t _dl_phnum;
    #endif

    @@ -2807,6 +2845,11 @@ index e871f27ff2..4b44beb3f4 100644
    /* This function changes the permission of the memory region pointed
    by STACK_ENDP to executable and update the internal memory protection
    flags for future thread stack creation. */
    +-int _dl_make_stack_executable (void **stack_endp) attribute_hidden;
    ++int _dl_make_stack_executable (const void *stack_endp) attribute_hidden;
    +
    + /* Variable pointing to the end of the stack (or close to it). This value + must be constant over the runtime of the application. Some programs
    diff --git a/sysdeps/ieee754/dbl-64/e_atanh.c b/sysdeps/ieee754/dbl-64/e_atanh.c
    index 1e09e46f0f..d1c71b2aa4 100644
    --- a/sysdeps/ieee754/dbl-64/e_atanh.c
    @@ -2949,6 +2992,25 @@ index dfe56fc2a0..5ee1d6f35e 100644
    {
    if (sgn)
    return -st[j].rh - st[j].rl;
    +diff --git a/sysdeps/mach/hurd/dl-execstack.c b/sysdeps/mach/hurd/dl-execstack.c
    +index 0617d3a161..dc4719bd38 100644
    +--- a/sysdeps/mach/hurd/dl-execstack.c
    ++++ b/sysdeps/mach/hurd/dl-execstack.c
    +@@ -26,12 +26,11 @@ extern struct hurd_startup_data *_dl_hurd_data attribute_hidden;
    + so as to mprotect it. */
    +
    + int
    +-_dl_make_stack_executable (void **stack_endp)
    ++_dl_make_stack_executable (const void *stack_endp)
    + {
    + /* Challenge the caller. */
    +- if (__builtin_expect (*stack_endp != __libc_stack_end, 0))
    ++ if (__glibc_unlikely (stack_endp != __libc_stack_end))
    + return EPERM;
    +- *stack_endp = NULL;
    +
    + #if IS_IN (rtld)
    + if (__mprotect ((void *)_dl_hurd_data->stack_base, _dl_hurd_data->stack_size,
    diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h
    index 7c24c0a6be..e614c7f3c9 100644
    --- a/sysdeps/nptl/bits/thread-shared-types.h
    @@ -2988,7 +3050,7 @@ index 050b4ab8d1..9ad36cabe9 100644

    /* Cleanup buffers */
    diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
    -index a123e28a57..2e0ce773a0 100644
    +index a123e28a57..7fcbc72bc0 100644
    --- a/sysdeps/pthread/Makefile
    +++ b/sysdeps/pthread/Makefile
    @@ -106,6 +106,7 @@ tests += \
    @@ -2999,6 +3061,35 @@ index a123e28a57..2e0ce773a0 100644
    tst-cleanup0 \
    tst-cleanup1 \
    tst-cleanup2 \
    +@@ -271,6 +272,7 @@ tests += \
    + tst-spin4 \
    + tst-spin5 \
    + tst-stack1 \
    ++ tst-stack2 \
    + tst-stdio1 \
    + tst-stdio2 \
    + tst-thrd-detach \
    +@@ -366,6 +368,7 @@ modules-names += \
    + tst-atfork4mod \
    + tst-create1mod \
    + tst-fini1mod \
    ++ tst-stack2-mod \
    + tst-tls4moda \
    + tst-tls4modb \
    + # modules-names
    +@@ -539,4 +542,12 @@ LDFLAGS-tst-create1 = -Wl,-export-dynamic
    + $(objpfx)tst-create1: $(shared-thread-library)
    + $(objpfx)tst-create1.out: $(objpfx)tst-create1mod.so
    +
    ++$(objpfx)tst-stack2.out: $(objpfx)tst-stack2-mod.so ++$(objpfx)tst-stack2-mod.so: $(shared-thread-library) ++LDFLAGS-tst-stack2-mod.so = -Wl,-z,execstack
    ++ifeq ($(have-no-error-execstack),yes)
    ++LDFLAGS-tst-stack2-mod.so += -Wl,--no-error-execstack
    ++endif
    ++tst-stack2-ENV = GLIBC_TUNABLES=glibc.rtld.execstack=2
    ++
    + endif
    diff --git a/sysdeps/pthread/tst-cancel32.c b/sysdeps/pthread/tst-cancel32.c
    new file mode 100644
    index 0000000000..ab550c16bf
    @@ -3078,6 +3169,104 @@ index 0000000000..ab550c16bf
    +}
    +
    +#include <support/test-driver.c>
    +diff --git a/sysdeps/pthread/tst-stack2-mod.c b/sysdeps/pthread/tst-stack2-mod.c
    +new file mode 100644
    +index 0000000000..806fdbcd8d
    +--- /dev/null
    ++++ b/sysdeps/pthread/tst-stack2-mod.c
    +@@ -0,0 +1,39 @@
    ++/* Check if pthread_getattr_np works within modules with non-exectuble
    ++ stacks (BZ 32897).
    ++ Copyright (C) 2025 Free Software Foundation, Inc.
    ++ This file is part of the GNU C Library.
    ++
    ++ The GNU C Library is free software; you can redistribute it and/or
    ++ modify it under the terms of the GNU Lesser General Public
    ++ License as published by the Free Software Foundation; either
    ++ version 2.1 of the License, or (at your option) any later version.
    ++
    ++ The GNU C Library is distributed in the hope that it will be useful,
    ++ but WITHOUT ANY WARRANTY; without even the implied warranty of
    ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    ++ Lesser General Public License for more details.
    ++
    ++ You should have received a copy of the GNU Lesser General Public
    ++ License along with the GNU C Library; if not, see
    ++ <https://www.gnu.org/licenses/>. */
    ++
    ++#include <pthread.h>
    ++
    ++bool init_result;
    ++
    ++void
    ++__attribute__ ((constructor))
    ++init (void)
    ++{
    ++ pthread_t me = pthread_self ();
    ++ pthread_attr_t attr;
    ++ init_result = pthread_getattr_np (me, &attr) == 0;
    ++}
    ++
    ++int
    ++mod_func (void)
    ++{
    ++ pthread_t me = pthread_self ();
    ++ pthread_attr_t attr;
    ++ return pthread_getattr_np (me, &attr);
    ++}
    +diff --git a/sysdeps/pthread/tst-stack2.c b/sysdeps/pthread/tst-stack2.c +new file mode 100644
    +index 0000000000..20ab5af166
    +--- /dev/null
    ++++ b/sysdeps/pthread/tst-stack2.c
    +@@ -0,0 +1,47 @@
    ++/* Check if pthread_getattr_np works within modules with non-exectuble
    ++ stacks (BZ 32897).
    ++ Copyright (C) 2025 Free Software Foundation, Inc.
    ++ This file is part of the GNU C Library.
    ++
    ++ The GNU C Library is free software; you can redistribute it and/or
    ++ modify it under the terms of the GNU Lesser General Public
    ++ License as published by the Free Software Foundation; either
    ++ version 2.1 of the License, or (at your option) any later version.
    ++
    ++ The GNU C Library is distributed in the hope that it will be useful,
    ++ but WITHOUT ANY WARRANTY; without even the implied warranty of
    ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    ++ Lesser General Public License for more details.
    ++
    ++ You should have received a copy of the GNU Lesser General Public
    ++ License along with the GNU C Library; if not, see
    ++ <https://www.gnu.org/licenses/>. */
    ++
    ++#include <pthread.h>
    ++#include <stdbool.h>
    ++#include <support/xdlfcn.h>
    ++#include <support/check.h>
    ++
    ++static int
    ++do_test (void)
    ++{
    ++ {
    ++ pthread_t me = pthread_self ();
    ++ pthread_attr_t attr;
    ++ TEST_COMPARE (pthread_getattr_np (me, &attr), 0);
    ++ }
    ++
    ++ void *h = xdlopen ("tst-stack2-mod.so", RTLD_NOW);
    ++
    ++ bool *init_result = xdlsym (h, "init_result");
    ++ TEST_COMPARE (*init_result, true);
    ++
    ++ int (*mod_func)(void) = xdlsym (h, "mod_func");
    ++ TEST_COMPARE (mod_func (), 0);
    ++
    ++ xdlclose (h);
    ++
    ++ return 0;
    ++}
    ++
    ++#include <support/test-driver.c>
    diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
    index a30892f080..dcc3e0883b 100644
    --- a/sysdeps/riscv/dl-machine.h
    @@ -3905,6 +4094,33 @@ index 3656e98eda..39b0b3d19c 100644

    #endif

    +diff --git a/sysdeps/unix/sysv/linux/dl-execstack.c b/sysdeps/unix/sysv/linux/dl-execstack.c
    +index 9791b339ca..6db9601656 100644
    +--- a/sysdeps/unix/sysv/linux/dl-execstack.c
    ++++ b/sysdeps/unix/sysv/linux/dl-execstack.c
    +@@ -19,10 +19,10 @@
    + #include <ldsodefs.h>
    +
    + int
    +-_dl_make_stack_executable (void **stack_endp)
    ++_dl_make_stack_executable (const void *stack_endp)
    + {
    + /* This gives us the highest/lowest page that needs to be changed. */
    +- uintptr_t page = ((uintptr_t) *stack_endp
    ++ uintptr_t page = ((uintptr_t) stack_endp
    + & -(intptr_t) GLRO(dl_pagesize));
    +
    + if (__mprotect ((void *) page, GLRO(dl_pagesize),
    +@@ -35,9 +35,6 @@ _dl_make_stack_executable (void **stack_endp)
    + ) != 0)
    + return errno;
    +
    +- /* Clear the address. */
    +- *stack_endp = NULL;
    +-
    + /* Remember that we changed the permission. */
    + GL(dl_stack_flags) |= PF_X;
    +
    diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h
    index f89e784243..d2ab4cb829 100644
    --- a/sysdeps/unix/sysv/linux/rseq-internal.h
    @@ -4642,6 +4858,18 @@ index 0000000000..f0024c143d
    +++ b/sysdeps/x86/tst-gnu2-tls2-x86-noxsavexsavec.c
    @@ -0,0 +1 @@
    +#include <elf/tst-gnu2-tls2.c>
    +diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile
    +index 9d31685e02..5723ec1847 100644
    +--- a/sysdeps/x86_64/Makefile
    ++++ b/sysdeps/x86_64/Makefile
    +@@ -142,7 +142,6 @@ CFLAGS-tst-avxmod.c += $(AVX-CFLAGS)
    + AVX512-CFLAGS = -mavx512f
    + CFLAGS-tst-audit10-aux.c += $(AVX512-CFLAGS)
    + CFLAGS-tst-auditmod10a.c += $(AVX512-CFLAGS)
    +-CFLAGS-tst-auditmod10b.c += $(AVX512-CFLAGS)
    + CFLAGS-tst-avx512-aux.c += $(AVX512-CFLAGS)
    + CFLAGS-tst-avx512mod.c += $(AVX512-CFLAGS)
    +
    diff --git a/sysdeps/x86_64/dl-tlsdesc-dynamic.h b/sysdeps/x86_64/dl-tlsdesc-dynamic.h
    index 9965ddd2c0..4f496de8c8 100644
    --- a/sysdeps/x86_64/dl-tlsdesc-dynamic.h
    @@ -4867,3 +5095,149 @@ index 0000000000..5539b6c61c
    +# define __tanh __tanh_sse2
    +#endif
    +#include <sysdeps/ieee754/dbl-64/s_tanh.c>
    +diff --git a/sysdeps/x86_64/tst-auditmod10b.c b/sysdeps/x86_64/tst-auditmod10b.c
    +index 6eb21b6f06..0b994ef0f0 100644
    +--- a/sysdeps/x86_64/tst-auditmod10b.c
    ++++ b/sysdeps/x86_64/tst-auditmod10b.c
    +@@ -125,7 +125,6 @@ la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
    +
    + #include <tst-audit.h>
    +
    +-#ifdef __AVX512F__
    + #include <immintrin.h>
    + #include <cpuid.h>
    +
    +@@ -148,9 +147,37 @@ check_avx512 (void)
    + return (eax & 0xe6) == 0xe6;
    + }
    +
    +-#else
    +-#include <emmintrin.h>
    +-#endif
    ++void
    ++__attribute__ ((target ("avx512f")))
    ++pltenter_avx512f (La_regs *regs, long int *framesizep)
    ++{
    ++ __m512i zero = _mm512_setzero_si512 ();
    ++ if (memcmp (&regs->lr_vector[0], &zero, sizeof (zero))
    ++ || memcmp (&regs->lr_vector[1], &zero, sizeof (zero))
    ++ || memcmp (&regs->lr_vector[2], &zero, sizeof (zero))
    ++ || memcmp (&regs->lr_vector[3], &zero, sizeof (zero))
    ++ || memcmp (&regs->lr_vector[4], &zero, sizeof (zero))
    ++ || memcmp (&regs->lr_vector[5], &zero, sizeof (zero))
    ++ || memcmp (&regs->lr_vector[6], &zero, sizeof (zero))
    ++ || memcmp (&regs->lr_vector[7], &zero, sizeof (zero)))
    ++ abort ();
    ++
    ++ for (int i = 0; i < 8; i++)
    ++ regs->lr_vector[i].zmm[0]
    ++ = (La_x86_64_zmm) _mm512_set1_epi64 (i + 1);
    ++
    ++ __m512i zmm = _mm512_set1_epi64 (-1);
    ++ asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" );
    ++ asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" );
    ++ asm volatile ("vmovdqa64 %0, %%zmm2" : : "x" (zmm) : "xmm2" );
    ++ asm volatile ("vmovdqa64 %0, %%zmm3" : : "x" (zmm) : "xmm3" );
    ++ asm volatile ("vmovdqa64 %0, %%zmm4" : : "x" (zmm) : "xmm4" );
    ++ asm volatile ("vmovdqa64 %0, %%zmm5" : : "x" (zmm) : "xmm5" );
    ++ asm volatile ("vmovdqa64 %0, %%zmm6" : : "x" (zmm) : "xmm6" );
    ++ asm volatile ("vmovdqa64 %0, %%zmm7" : : "x" (zmm) : "xmm7" );
    ++
    ++ *framesizep = 1024;
    ++}
    +
    + ElfW(Addr)
    + pltenter (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
    +@@ -160,39 +187,33 @@ pltenter (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
    + printf ("pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
    + symname, (long int) sym->st_value, ndx, *flags);
    +
    +-#ifdef __AVX512F__
    + if (check_avx512 () && strcmp (symname, "audit_test") == 0)
    ++ pltenter_avx512f (regs, framesizep);
    ++
    ++ return sym->st_value;
    ++}
    ++
    ++void
    ++__attribute__ ((target ("avx512f")))
    ++pltexit_avx512f (const La_regs *inregs, La_retval *outregs)
    ++{
    ++ __m512i zero = _mm512_setzero_si512 ();
    ++ if (memcmp (&outregs->lrv_vector0, &zero, sizeof (zero)))
    ++ abort ();
    ++
    ++ for (int i = 0; i < 8; i++)
    + {
    +- __m512i zero = _mm512_setzero_si512 ();
    +- if (memcmp (&regs->lr_vector[0], &zero, sizeof (zero))
    +- || memcmp (&regs->lr_vector[1], &zero, sizeof (zero))
    +- || memcmp (&regs->lr_vector[2], &zero, sizeof (zero))
    +- || memcmp (&regs->lr_vector[3], &zero, sizeof (zero))
    +- || memcmp (&regs->lr_vector[4], &zero, sizeof (zero))
    +- || memcmp (&regs->lr_vector[5], &zero, sizeof (zero))
    +- || memcmp (&regs->lr_vector[6], &zero, sizeof (zero))
    +- || memcmp (&regs->lr_vector[7], &zero, sizeof (zero)))
    +- abort ();
    +-
    +- for (int i = 0; i < 8; i++)
    +- regs->lr_vector[i].zmm[0]
    +- = (La_x86_64_zmm) _mm512_set1_epi64 (i + 1);
    +-
    +- __m512i zmm = _mm512_set1_epi64 (-1);
    +- asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" );
    +- asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" );
    +- asm volatile ("vmovdqa64 %0, %%zmm2" : : "x" (zmm) : "xmm2" );
    +- asm volatile ("vmovdqa64 %0, %%zmm3" : : "x" (zmm) : "xmm3" );
    +- asm volatile ("vmovdqa64 %0, %%zmm4" : : "x" (zmm) : "xmm4" );
    +- asm volatile ("vmovdqa64 %0, %%zmm5" : : "x" (zmm) : "xmm5" );
    +- asm volatile ("vmovdqa64 %0, %%zmm6" : : "x" (zmm) : "xmm6" );
    +- asm volatile ("vmovdqa64 %0, %%zmm7" : : "x" (zmm) : "xmm7" );
    +-
    +- *framesizep = 1024;
    ++ __m512i zmm = _mm512_set1_epi64 (i + 1);
    ++ if (memcmp (&inregs->lr_vector[i], &zmm, sizeof (zmm)) != 0)
    ++ abort ();
    + }
    +-#endif
    +
    +- return sym->st_value;
    ++ outregs->lrv_vector0.zmm[0]
    ++ = (La_x86_64_zmm) _mm512_set1_epi64 (0x12349876);
    ++
    ++ __m512i zmm = _mm512_set1_epi64 (-1);
    ++ asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" );
    ++ asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" );
    + }
    +
    + unsigned int
    +@@ -204,28 +225,8 @@ pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
    + symname, (long int) sym->st_value, ndx,
    + (ptrdiff_t) outregs->int_retval);
    +
    +-#ifdef __AVX512F__
    + if (check_avx512 () && strcmp (symname, "audit_test") == 0)
    +- {
    +- __m512i zero = _mm512_setzero_si512 ();
    +- if (memcmp (&outregs->lrv_vector0, &zero, sizeof (zero)))
    +- abort ();
    +-
    +- for (int i = 0; i < 8; i++)
    +- {
    +- __m512i zmm = _mm512_set1_epi64 (i + 1);
    +- if (memcmp (&inregs->lr_vector[i], &zmm, sizeof (zmm)) != 0)
    +- abort ();
    +- }
    +-
    +- outregs->lrv_vector0.zmm[0]
    +- = (La_x86_64_zmm) _mm512_set1_epi64 (0x12349876);
    +-
    +- __m512i zmm = _mm512_set1_epi64 (-1);
    +- asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" );
    +- asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" );
    +- }
    +-#endif
    ++ pltexit_avx512f (inregs, outregs);
    +
    + return 0;
    + }
    diff --git a/debian/patches/hurd-i386/git-dup-refcnt.diff b/debian/patches/hurd-i386/git-dup-refcnt.diff
    new file mode 100644
    index 00000000..d50ff690
    --- /dev/null
    +++ b/debian/patches/hurd-i386/git-dup-refcnt.diff
    @@ -0,0 +1,152 @@
    +commit e150ee870907e1c5ded4aad8d22a92a98f59d243
    +Author: Zhaoming Luo <zhmingluo@163.com>
    +Date: Mon Mar 10 16:44:09 2025 +0800
    +
    + hurd: Check return value of mach_port_mod_refs() in the dup routine of fcntl()
    +
    + Message-ID: <20250310084409.24177-1-zhmingluo@163.com>
    +
    +diff --git a/sysdeps/mach/hurd/dup3.c b/sysdeps/mach/hurd/dup3.c
    +index 22af45b491..49545ae63a 100644
    +--- a/sysdeps/mach/hurd/dup3.c
    ++++ b/sysdeps/mach/hurd/dup3.c
    +@@ -69,6 +69,7 @@ __dup3 (int fd, int fd2, int flags)
    + {
    + /* Get a hold of the destination descriptor. */
    + struct hurd_fd *d2;
    ++ error_t err;
    +
    + __mutex_lock (&_hurd_dtable_lock);
    +
    +@@ -107,22 +108,51 @@ __dup3 (int fd, int fd2, int flags)
    + }
    + else
    + {
    +- /* Give the ports each a user ref for the new descriptor. */
    +- __mach_port_mod_refs (__mach_task_self (), port,
    +- MACH_PORT_RIGHT_SEND, 1);
    +- if (ctty != MACH_PORT_NULL)
    +- __mach_port_mod_refs (__mach_task_self (), ctty,
    +- MACH_PORT_RIGHT_SEND, 1);
    +-
    +- /* Install the ports and flags in the new descriptor slot. */
    +- __spin_lock (&d2->port.lock);
    +- if (flags & O_CLOEXEC)
    +- d2->flags = d_flags | FD_CLOEXEC;
    +- else
    +- /* dup clears FD_CLOEXEC. */
    +- d2->flags = d_flags & ~FD_CLOEXEC;
    +- _hurd_port_set (&d2->ctty, ctty);
    +- _hurd_port_locked_set (&d2->port, port); /* Unlocks D2. */
    ++ /* Give the io server port a user ref for the new descriptor. */ ++ err = __mach_port_mod_refs (__mach_task_self (), port,
    ++ MACH_PORT_RIGHT_SEND, 1);
    ++
    ++ if (err == KERN_UREFS_OVERFLOW)
    ++ fd2 = __hurd_fail (EMFILE);
    ++ else if (err)
    ++ fd2 = __hurd_fail (EINVAL);
    ++ else if (ctty != MACH_PORT_NULL)
    ++ {
    ++ /* We have confirmed the io server port has got a user ref
    ++ count, now give ctty port a user ref for the new
    ++ descriptor. */
    ++ err = __mach_port_mod_refs (__mach_task_self (), ctty,
    ++ MACH_PORT_RIGHT_SEND, 1);
    ++
    ++ if (err)
    ++ {
    ++ /* In this case the io server port has got a ref count
    ++ but the ctty port failed to get one, so we need to
    ++ clean the ref count we just assigned. */
    ++ __mach_port_mod_refs (__mach_task_self (), port,
    ++ MACH_PORT_RIGHT_SEND, -1);
    ++
    ++ if (err == KERN_UREFS_OVERFLOW)
    ++ fd2 = __hurd_fail (EMFILE);
    ++ else
    ++ fd2 = __hurd_fail (EINVAL);
    ++ }
    ++ }
    ++
    ++ if (!err)
    ++ {
    ++ /* The ref counts of the ports are incremented
    ++ successfully. */
    ++ /* Install the ports and flags in the new descriptor slot. */
    ++ __spin_lock (&d2->port.lock);
    ++ if (flags & O_CLOEXEC)
    ++ d2->flags = d_flags | FD_CLOEXEC;
    ++ else
    ++ /* dup clears FD_CLOEXEC. */
    ++ d2->flags = d_flags & ~FD_CLOEXEC;
    ++ _hurd_port_set (&d2->ctty, ctty);
    ++ _hurd_port_locked_set (&d2->port, port); /* Unlocks D2. */ ++ }
    + }
    + }
    +
    +diff --git a/sysdeps/mach/hurd/fcntl.c b/sysdeps/mach/hurd/fcntl.c
    +index a65c190cac..de576af1b7 100644
    +--- a/sysdeps/mach/hurd/fcntl.c
    ++++ b/sysdeps/mach/hurd/fcntl.c
    +@@ -83,18 +83,47 @@ __libc_fcntl (int fd, int cmd, ...)
    + result = -1;
    + else
    + {
    +- /* Give the ports each a user ref for the new descriptor. */
    +- __mach_port_mod_refs (__mach_task_self (), port,
    +- MACH_PORT_RIGHT_SEND, 1);
    +- if (ctty != MACH_PORT_NULL)
    +- __mach_port_mod_refs (__mach_task_self (), ctty,
    +- MACH_PORT_RIGHT_SEND, 1);
    +-
    +- /* Install the ports and flags in the new descriptor. */
    +- if (ctty != MACH_PORT_NULL)
    +- _hurd_port_set (&new->ctty, ctty);
    +- new->flags = flags;
    +- _hurd_port_locked_set (&new->port, port); /* Unlocks NEW. */
    ++ /* Give the io server port a user ref for the new descriptor. */ ++ err = __mach_port_mod_refs (__mach_task_self (), port,
    ++ MACH_PORT_RIGHT_SEND, 1);
    ++
    ++ if (err == KERN_UREFS_OVERFLOW)
    ++ result = __hurd_fail (EMFILE);
    ++ else if (err)
    ++ result = __hurd_fail (EINVAL);
    ++ else if (ctty != MACH_PORT_NULL)
    ++ {
    ++ /* We have confirmed the io server port has got a user ref
    ++ count, now give ctty port a user ref for the new
    ++ descriptor. */
    ++ err = __mach_port_mod_refs (__mach_task_self (), ctty,
    ++ MACH_PORT_RIGHT_SEND, 1);
    ++
    ++ if (err)
    ++ {
    ++ /* In this case the io server port has got a ref count
    ++ but the ctty port fails to get one, so we need to clean
    ++ the ref count we just assigned. */
    ++ __mach_port_mod_refs (__mach_task_self (), port,
    ++ MACH_PORT_RIGHT_SEND, -1);
    ++
    ++ if (err == KERN_UREFS_OVERFLOW)
    ++ result = __hurd_fail (EMFILE);
    ++ else
    ++ result = __hurd_fail (EINVAL);
    ++ }
    ++ }
    ++
    ++ if (!err)
    ++ {
    ++ /* The ref counts of the ports are incremented successfully. */
    ++ /* Install the ports and flags in the new descriptor. */
    ++ if (ctty != MACH_PORT_NULL)
    ++ _hurd_port_set (&new->ctty, ctty);
    ++ new->flags = flags;
    ++ /* Unlocks NEW. */
    ++ _hurd_port_locked_set (&new->port, port);
    ++ }
    + }
    +
    + HURD_CRITICAL_END;
    diff --git a/debian/patches/hurd-i386/git-signal-fpe-exceptions.diff b/debian/patches/hurd-i386/git-signal-fpe-exceptions.diff
    new file mode 100644
    index 00000000..68468271
    --- /dev/null
    +++ b/debian/patches/hurd-i386/git-signal-fpe-exceptions.diff
    @@ -0,0 +1,46 @@
    +Index: glibc-2.41/sysdeps/mach/hurd/x86/trampoline.c +===================================================================
    +--- glibc-2.41.orig/sysdeps/mach/hurd/x86/trampoline.c
    ++++ glibc-2.41/sysdeps/mach/hurd/x86/trampoline.c
    +@@ -461,7 +461,10 @@ _hurd_setup_sighandler (struct hurd_sigs
    + - in gdb: gdb/i386-gnu-tdep.c gnu_sigtramp_code. */
    +
    + #ifdef __x86_64__
    +-asm ("rpc_wait_trampoline:\n"
    ++asm ("trampoline:\n"
    ++ "fnclex\n" /* Clear any pending exception. */
    ++ "jmp _trampoline\n"
    ++ "rpc_wait_trampoline:\n"
    + /* This is the entry point when we have an RPC reply message to receive
    + before running the handler. The MACH_MSG_SEND bit has already been
    + cleared in the OPTION argument in our %rsi. The interrupted user
    +@@ -480,7 +483,7 @@ asm ("rpc_wait_trampoline:\n"
    + /* Switch to the signal stack. */
    + "movq %rbx, %rsp\n"
    +
    +- "trampoline:\n"
    ++ "_trampoline:\n"
    + /* Entry point for running the handler normally. The arguments to the + handler function are on the top of the stack, same as in the i386
    + version:
    +@@ -506,7 +509,10 @@ asm ("rpc_wait_trampoline:\n"
    + "movq 16(%rsp), %rdi\n"
    + "ret");
    + #else
    +-asm ("rpc_wait_trampoline:\n");
    ++asm ("trampoline:\n"
    ++ "fnclex\n" /* Clear any pending exception. */
    ++ "jmp _trampoline\n"
    ++ "rpc_wait_trampoline:\n");
    + /* This is the entry point when we have an RPC reply message to receive
    + before running the handler. The MACH_MSG_SEND bit has already been
    + cleared in the OPTION argument on our stack. The interrupted user
    +@@ -526,7 +532,7 @@ asm (/* Retry the interrupted mach_msg s
    + /* Switch to the signal stack. */
    + "movl %ebx, %esp\n");
    +
    +- asm ("trampoline:\n");
    ++asm ("_trampoline:\n");
    + /* Entry point for running the handler normally. The arguments to the
    + handler function are already on the top of the stack:
    +
    diff --git a/debian/patches/hurd-i386/git-symlink-eexist.diff b/debian/patches/hurd-i386/git-symlink-eexist.diff
    new file mode 100644
    index 00000000..5e7324fd
    --- /dev/null
    +++ b/debian/patches/hurd-i386/git-symlink-eexist.diff
    @@ -0,0 +1,22 @@
    +commit 1eb32c5788a59b821087f971821536a22a3b65de
    +Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
    +Date: Mon Apr 21 22:21:17 2025 +0200
    +
    + hurd: Make symlink return EEXIST on existing target directory
    +
    + The gnulib testsuite does not recognize ENOTDIR for such a situation,
    + and this error is indeed more comprehensible to users.
    +
    +diff --git a/sysdeps/mach/hurd/symlinkat.c b/sysdeps/mach/hurd/symlinkat.c +index e7dfb673df..cb6250e6f0 100644
    +--- a/sysdeps/mach/hurd/symlinkat.c
    ++++ b/sysdeps/mach/hurd/symlinkat.c
    +@@ -47,7 +47,7 @@ __symlinkat (const char *from, int fd, const char *to)
    +
    + if (! *name)
    + /* Can't link to the existing directory itself. */
    +- err = ENOTDIR;
    ++ err = EEXIST;
    + else
    + /* Create a new, unlinked node in the target directory. */

    [continued in next message]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Cyril Brulebois@21:1/5 to All on Wed May 14 18:50:01 2025
    XPost: linux.debian.maint.boot, linux.debian.devel.release

    Hi,

    Sebastian Ramacher <sramacher@debian.org> (2025-05-14):
    Control: tags -1 confirmed

    On 2025-05-12 20:07:15 +0200, Aurelien Jarno wrote:
    Package: release.debian.org
    Severity: normal
    X-Debbugs-Cc: glibc@packages.debian.org
    Control: affects -1 + src:glibc
    User: release.debian.org@packages.debian.org
    Usertags: unblock

    Please pre-approve unblocking of package glibc/2.41-8

    ACK from RT. Adding d-boot for the d-i ACK. It might make sense to wait
    until after the next RC from d-i with the upload.

    If you can wait a few days, that would be best. I don't want to jinx
    it so I won't mention the expected (short) timeline.

    Feel free to upload as soon as you see the announce hits the lists.


    Cheers,
    --
    Cyril Brulebois (kibi@debian.org) <https://debamax.com/>
    D-I release manager -- Release team member -- Freelance Consultant

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEEtg6/KYRFPHDXTPR4/5FK8MKzVSAFAmgkx7IACgkQ/5FK8MKz VSBxDA//QGA56s7P/kbObijoG9xNXeCk4zSOIiva+ikxLkqKxX+loUM8f4dsqLo/ ZNnIB4pnMH6rDAQkmJXL/mO+sjYW/l8G4AlXwT83k4Lr7qvjidiBSNoJ2inWwVpm tMmKgNFW6hnKeITvwJ/erV++oqog/OUIK9zeiCsnUfMF6QLO2udRlhmQAfHjFWwx 5c97RgKuZ1vNiwwJWX0y/VXekKDl9wYxW7MxaxV22DoHpgUMTvR1rDe4LzhBbIkZ fCvqtnxti9ywBsCElcYDcZBobxQmN7XVVOmIA+R11KkEn4ip9K8TG2d/1vpw3xFs fdPtIzijlD4bOBwsGnK1kdWq4Xi1MzjPAc106+vdkAG6+Ypg3U/i1AIGBd733lrM ol00wdZ9Bl5JmVnFWH+cQ26OBu8D52DzH26fYbTwkrurxY3VVOng2awSHlcNp2X7 qq5NK5QZmhztm+JJTgZjcjiPKv6ydGLwC0+txmUWahIX7ecvPJQHGtqej/SCJU9+ 7t2RYCycSzLSKMluepDOX2j3Sd2p3LDgpzBr/j0oQRfv+8ae888QnE4wt/dysZD9 lxj7Se5lfQ3/v0g9qLxqcLTlAlB3gvaKK46O1S2j0Wfe+3PVe2L+wrDPpWB+ZwTK aF7Skc7kIxA6uSplfioNyIUkY+BKXpvWz1d/k5eGEps1Voze+YQ=
    =OW74
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    *
  • From Cyril Brulebois@21:1/5 to All on Fri May 16 17:30:01 2025
    XPost: linux.debian.maint.boot, linux.debian.devel.release

    Cyril Brulebois <kibi@debian.org> (2025-05-14):
    If you can wait a few days, that would be best. I don't want to jinx
    it so I won't mention the expected (short) timeline.

    Feel free to upload as soon as you see the announce hits the lists.

    Images are built and don't look too broken: udeb freeze just lifted,
    feel free to upload.


    Cheers,
    --
    Cyril Brulebois (kibi@debian.org) <https://debamax.com/>
    D-I release manager -- Release team member -- Freelance Consultant

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEEtg6/KYRFPHDXTPR4/5FK8MKzVSAFAmgnWEIACgkQ/5FK8MKz VSCZgBAAsFrlj03wPL4FJinlM7VIzHh9TqrO5B87tqyL4lDDxJEaVkxMohVNc3d+ 7k9t2IockzuC38AvnjMjesGCBkHOwkC0gR7kVlnKUVGN5Uqh+DIXiGBivBddxsCk tXZO4dGGZkBhIY7f2xqYRnedtrgzpk+qdMqRNPbFbkmNrM0g6B750ISCdi4noLaQ vj8pJBeJGwe98RRJKV/LtjpyqQAC5zx3HMMMw5kKoT2Ux4D9H1qZnxvuuRdYQ4BT LS0NfpFoQg8S9bWhyd/yG1JwZpJpGArz9fzUG3fNFuGZvMGLEB248RV+UO+GLr9e pCLn8CHiXsE31dcM0GsCK7O3e7hyw5c0teSIM8sscktqmvb/rXKICv3MZ3Hdd7Hp 79kIHP1GScuU2X7e88JCFIaM9BlyYHlZf3fObMZEBR2+q0WLcxV4NCrMm8pPuG+t P2f5kKsZ9638+ss43rj4puPjLBlcWCYfCPSujWkre2vkI5p/3NfqfuM8nBvQWP2p GrWMoYhn6e31oUrGOUW/y/WbuOGbe75hVtX2s28Nk2Fr1i1U/HPxckJgEjXEhhEM JS8fTnZdoF2E26GwyVG7MHBC/i31zWdaNg+GmdvVhjelbN0F/OlnjoSyWVI/pTuW tePrnKfRisJwIpObT2/AnKng2Hkm8UHv+L5CU8vlww7SOE9AWiQ=
    =EYOI
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    *
  • From Aurelien Jarno@21:1/5 to Cyril Brulebois on Sat May 17 17:30:01 2025
    XPost: linux.debian.maint.boot, linux.debian.devel.release

    On 2025-05-16 17:22, Cyril Brulebois wrote:
    Cyril Brulebois <kibi@debian.org> (2025-05-14):
    If you can wait a few days, that would be best. I don't want to jinx
    it so I won't mention the expected (short) timeline.

    Feel free to upload as soon as you see the announce hits the lists.

    Images are built and don't look too broken: udeb freeze just lifted,
    feel free to upload.

    Thanks, I have just uploaded it.

    Cheers,
    Aurelien

    --
    Aurelien Jarno GPG: 4096R/1DDD8C9B aurelien@aurel32.net http://aurel32.net

    -----BEGIN PGP SIGNATURE-----

    iQIzBAEBCgAdFiEEUryGlb40+QrX1Ay4E4jA+JnoM2sFAmgoqVsACgkQE4jA+Jno M2u1Mg/+OHcFVIDJRNfPkiw6D9bMcIdrfPYwdK0czb6q1zTUSw1vcsVuo1U/xdZs cpMMrV/7tI1Zm8v7OHm2x2qy2gSjp522c4b4A7gTm0kualIxKbMJIp9/GanqJ+fg bJ1UKtiij7wkuUvp2EuD+OAMCJg4iHZZkhKDFBRe2GUaCzlCinOhMaKPv3YwUlSS Lb4a7RLzhQXQ1AZ0UgEye/c4TyXlLtCaAyblJdAya7coE69UIUjC3UcO3RO2732O UpYxzVYlSO9JT+1Lx/UqkEovQhtQZCG5QiWUUNXQeP/vvaCMh3v+aMC06xLydD8o v60FSsPsoqeh9r/jYUo5z6X7OFQvIGCxJ4e5yY/uvpHksfKUeccYbqeX+i1UDxgC 4SadTzFjgmVLb+03mg+LjrV8f54ea/gpPVO+IXSN2oZ/Q88qj5A6UfDLOuR+U3ya dKpaGZ7+TNQ/p3h1PizcfO9BIb9+tQE+IkQYW6V9LiU58OmZV/DIRGiHfc3532ht +/EMI9st0NHjukk2B+MvmPqA+0gx1fpyZ9Itkz+K0z0F1qU/mC5dJ3yfGqJ1o97T 229BtjHV9L14z86BZM83wMfLcVrXp3BfTzf8mmlRBAK4ikKvdEpoRX5UFIf8haK2 9+J8NjQ9UXpCAA15tHls31xTcX4n4CYLvm063Jsq2rNRp0hwG38=
    =wFIU
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet