• 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