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
[ 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 (®s->lr_vector[0], &zero, sizeof (zero))
++ || memcmp (®s->lr_vector[1], &zero, sizeof (zero))
++ || memcmp (®s->lr_vector[2], &zero, sizeof (zero))
++ || memcmp (®s->lr_vector[3], &zero, sizeof (zero))
++ || memcmp (®s->lr_vector[4], &zero, sizeof (zero))
++ || memcmp (®s->lr_vector[5], &zero, sizeof (zero))
++ || memcmp (®s->lr_vector[6], &zero, sizeof (zero))
++ || memcmp (®s->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 (®s->lr_vector[0], &zero, sizeof (zero))
+- || memcmp (®s->lr_vector[1], &zero, sizeof (zero))
+- || memcmp (®s->lr_vector[2], &zero, sizeof (zero))
+- || memcmp (®s->lr_vector[3], &zero, sizeof (zero))
+- || memcmp (®s->lr_vector[4], &zero, sizeof (zero))
+- || memcmp (®s->lr_vector[5], &zero, sizeof (zero))
+- || memcmp (®s->lr_vector[6], &zero, sizeof (zero))
+- || memcmp (®s->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. */
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.
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.
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 480 |
Nodes: | 16 (2 / 14) |
Uptime: | 247:28:17 |
Calls: | 9,532 |
Files: | 13,650 |
Messages: | 6,137,781 |