Bug#1109399: unblock: glibc/2.41-10 (pre-approval) (2/2)
From
Aurelien Jarno@21:1/5 to
All on Wed Jul 16 17:50:01 2025
[continued from previous message]
++ bool ok = false;
++ struct scratch_buffer buf;
++ scratch_buffer_init (&buf);
++ while (true)
+ {
+- rmdir (dirname);
+- free (dirname);
++ struct group grp;
++ struct group *result = NULL;
++ int status = fgetgrent_r (fp, &grp, buf.data, buf.length, &result);
++ if (status == 0 && result != NULL)
++ {
++ if (strcmp (result->gr_name, name) == 0)
++ {
++ *target = result->gr_gid;
++ ok = true;
++ break;
++ }
++ }
++ else if (errno != ERANGE)
++ break;
++ else if (!scratch_buffer_grow (&buf))
++ break;
+ }
+-
+- if (ret == 77)
+- FAIL_UNSUPPORTED ("Failed to make sgid executable for test\n");
+- if (ret != 0)
+- FAIL_EXIT1 ("Failed to make sgid executable for test\n");
+-
+- return status;
++ scratch_buffer_free (&buf);
++ fclose (fp);
++ return ok;
}
- int
+-int
-support_capture_subprogram_self_sgid (char *child_id)
++void
+support_capture_subprogram_self_sgid (const char *child_id)
{
- gid_t target = 0;
+- gid_t target = 0;
const int count = 64;
+ gid_t groups[count];
+
+@@ -225,6 +207,7 @@ support_capture_subprogram_self_sgid (char *child_id)
+ (intmax_t) getuid ());
+
+ gid_t current = getgid ();
++ gid_t target = current;
+ for (int i = 0; i < ret; ++i)
+ {
+ if (groups[i] != current)
+@@ -234,11 +217,18 @@ support_capture_subprogram_self_sgid (char *child_id)
+ }
+ }
+
+- if (target == 0)
+- FAIL_UNSUPPORTED("Could not find a suitable GID for user %jd\n",
+- (intmax_t) getuid ());
++ if (target == current)
++ {
++ /* If running as root, try to find a harmless group for SGID. */
++ if (getuid () != 0
++ || (!find_sgid_group (&target, "nogroup")
++ && !find_sgid_group (&target, "bin")
++ && !find_sgid_group (&target, "daemon")))
++ FAIL_UNSUPPORTED("Could not find a suitable GID for user %jd\n",
++ (intmax_t) getuid ());
++ }
+
+- return copy_and_spawn_sgid (child_id, target);
++ copy_and_spawn_sgid (child_id, target);
+ }
+
+ void
diff --git a/sysdeps/aarch64/fpu/asinh_sve.c b/sysdeps/aarch64/fpu/asinh_sve.c
index 0889f79dbb..ff6b71390c 100644
--- a/sysdeps/aarch64/fpu/asinh_sve.c
@@ -4731,10 +5026,34 @@ index a30892f080..dcc3e0883b 100644
return lazy;
}
diff --git a/sysdeps/sparc/sparc32/start.S b/sysdeps/sparc/sparc32/start.S -index 694b020ce0..cef7c96cac 100644
+index 694b020ce0..8393760da6 100644
--- a/sysdeps/sparc/sparc32/start.S
+++ b/sysdeps/sparc/sparc32/start.S
-@@ -73,6 +73,10 @@ _start:
+@@ -35,6 +35,7 @@
+
+ #include <sysdep.h>
+
++#define FRAME_SIZE 104
+
+ .section ".text"
+ .align 4
+@@ -48,12 +49,12 @@ _start:
+ /* Terminate the stack frame, and reserve space for functions to
+ drop their arguments. */
+ mov %g0, %fp
+- sub %sp, 6*4, %sp
++ sub %sp, FRAME_SIZE, %sp
+
+ /* Extract the arguments and environment as encoded on the stack. The
+ argument info starts after one register window (16 words) past the SP. */
+- ld [%sp+22*4], %o1
+- add %sp, 23*4, %o2
++ ld [%sp+168], %o1
++ add %sp, 172, %o2
+
+ /* Load the addresses of the user entry points. */
+ #ifndef PIC
+@@ -73,6 +74,10 @@ _start:
be NULL. */
mov %g1, %o5
diff --git a/debian/patches/hurd-i386/local-pthread_once-2.42.diff b/debian/patches/hurd-i386/local-pthread_once-2.42.diff
new file mode 100644
index 00000000..716ebb08
--- /dev/null
+++ b/debian/patches/hurd-i386/local-pthread_once-2.42.diff
@@ -0,0 +1,52 @@
+Note: Keep the 2.41 symbol until we rebuild packages against the 2.42
+symbol.
+
+Index: glibc-upstream/sysdeps/htl/pt-once.c +===================================================================
+--- glibc-upstream.orig/sysdeps/htl/pt-once.c
++++ glibc-upstream/sysdeps/htl/pt-once.c
+@@ -58,5 +58,8 @@ libc_hidden_def (__pthread_once)
+ versioned_symbol (libc, __pthread_once, pthread_once, GLIBC_2_42);
+
+ #if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_42)
++compat_symbol (libpthread, __pthread_once, pthread_once, GLIBC_2_41); ++#endif
++#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_42)
+ compat_symbol (libpthread, __pthread_once, pthread_once, GLIBC_2_12);
+ #endif
+Index: glibc-upstream/sysdeps/mach/hurd/i386/libc.abilist +===================================================================
+--- glibc-upstream.orig/sysdeps/mach/hurd/i386/libc.abilist
++++ glibc-upstream/sysdeps