guix_mirror_bot pushed a commit to branch core-packages-team in repository guix.
commit e1aebde02680fb5c9da3c81b8a29c90fb65954d3 Author: Yelninei <[email protected]> AuthorDate: Fri Oct 9 18:06:28 2026 +0000 gnu: glibc: Fix setgroups on the Hurd. By convention the first uid/gid is the euid/egid. Previously seteuids/setgroups would replace the entire uid/gid array. With this patch it now ensures that the euid/egid is unchanged. * gnu/packages/patches/glibc-hurd-setgroups.patch: New patch. * gnu/packages/base.scm (%glibc-patches): Add it. * gnu/local.mk (dist_patch_DATA): Register it. Fixes: guix/guix#10460 Merges: #11746 --- gnu/local.mk | 1 + gnu/packages/base.scm | 1 + gnu/packages/patches/glibc-hurd-setgroups.patch | 225 ++++++++++++++++++++++++ 3 files changed, 227 insertions(+) diff --git a/gnu/local.mk b/gnu/local.mk index a61c35bccc5..0fa076852b7 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1524,6 +1524,7 @@ dist_patch_DATA = \ %D%/packages/patches/glibc-hurd-mach-print.patch \ %D%/packages/patches/glibc-hurd-unsupported-ioctls.patch \ %D%/packages/patches/glibc-hurd-signal-sa-siginfo.patch \ + %D%/packages/patches/glibc-hurd-setgroups.patch \ %D%/packages/patches/glibc-hurd64-gcc-14.2-tls-bug.patch \ %D%/packages/patches/glibc-ldd-powerpc.patch \ %D%/packages/patches/glibc-ldd-x86_64.patch \ diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index cce89bf6820..eb9dc0e0854 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -916,6 +916,7 @@ the store.") "glibc-2.41-hurd-local-clock_gettime_MONOTONIC.patch" "glibc-2.43-hurd-unimplemented-ioctls.patch" "glibc-hurd-unsupported-ioctls.patch" + "glibc-hurd-setgroups.patch" "glibc-hurd-ldconfig.patch" "glibc-hurd-mach-print.patch" "glibc-hurd-gettyent.patch" diff --git a/gnu/packages/patches/glibc-hurd-setgroups.patch b/gnu/packages/patches/glibc-hurd-setgroups.patch new file mode 100644 index 00000000000..506b14476e2 --- /dev/null +++ b/gnu/packages/patches/glibc-hurd-setgroups.patch @@ -0,0 +1,225 @@ +Upstream status: https://lists.gnu.org/archive/html/bug-hurd/2026-10/msg00131.html + +This fixes seteuids and setgroups unexpectedly changing the current euid/egid. + +Fixes guix/guix#10460. + +From 9ca6e677dd9b4e307cd175b9a1a86cd700354f96 Mon Sep 17 00:00:00 2001 +From: Yelninei <[email protected]> +Date: Fri, 9 Oct 2026 17:48:26 +0000 +Subject: [PATCH 1/4] hurd: seteuids: Specify MACH_MSG_TYPE_COPY_SEND. + +This prevents a EMIG_BAD_ARGUMENTS error. +--- + hurd/seteuids.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hurd/seteuids.c b/hurd/seteuids.c +index 0a1e533bb3..ea93e0c51e 100644 +--- a/hurd/seteuids.c ++++ b/hurd/seteuids.c +@@ -39,7 +39,7 @@ retry: + { + /* Get a new auth port using those IDs. */ + err = __USEPORT (AUTH, +- __auth_makeauth (port, NULL, 0, 0, ++ __auth_makeauth (port, NULL, MACH_MSG_TYPE_COPY_SEND, 0, + new, n, + _hurd_id.aux.uids, _hurd_id.aux.nuids, + _hurd_id.gen.gids, _hurd_id.gen.ngids, +-- +2.54.0 + +From c6b2ee6ba7ecc7c8aef565d0fe3d7a7b00a05870 Mon Sep 17 00:00:00 2001 +From: Yelninei <[email protected]> +Date: Fri, 9 Oct 2026 17:48:33 +0000 +Subject: [PATCH 2/4] hurd: seteuids: Change size argument to size_t. + +setuids is analogous to setgroups so make it match signatures. + +This changes ABI on 64b, but this function is essentially unused for +now, better fix its ABI already. +--- + hurd/hurd.h | 2 +- + hurd/seteuids.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/hurd/hurd.h b/hurd/hurd.h +index 05674a93bb..3f1865c57b 100644 +--- a/hurd/hurd.h ++++ b/hurd/hurd.h +@@ -177,7 +177,7 @@ extern int _hurd_change_directory_port_from_fd (struct hurd_port *portcell, + + /* Get and set the effective UID set. */ + extern int geteuids (int __n, uid_t *__uidset); +-extern int seteuids (int __n, const uid_t *__uidset); ++extern int seteuids (size_t __n, const uid_t *__uidset); + + + /* Split FILE into a directory and a name within the directory. The +diff --git a/hurd/seteuids.c b/hurd/seteuids.c +index ea93e0c51e..3be772ae8b 100644 +--- a/hurd/seteuids.c ++++ b/hurd/seteuids.c +@@ -20,11 +20,11 @@ + + /* Set the uid set for the current user to UIDS (N of them). */ + int +-seteuids (int n, const uid_t *uids) ++seteuids (size_t n, const uid_t *uids) + { + error_t err; + auth_t newauth; +- int i; ++ size_t i; + gid_t new[n]; + + /* Fault before taking locks. */ +-- +2.54.0 + +From 4e5627b5b9bbbc78ca7323966ce6fd4943754747 Mon Sep 17 00:00:00 2001 +From: Yelninei <[email protected]> +Date: Fri, 9 Oct 2026 17:48:38 +0000 +Subject: [PATCH 3/4] hurd: Preserve the euid/egid in seteuids/setgroups. + +By convention the first uid/gid is the euid/egid. Ensure that the +first uid/gid in the array passed to auth_makeauth is the egid/egid to +not unexpectedly overwrite it. +--- + hurd/seteuids.c | 17 +++++++++++++---- + sysdeps/mach/hurd/setgroups.c | 17 +++++++++++++---- + 2 files changed, 26 insertions(+), 8 deletions(-) + +diff --git a/hurd/seteuids.c b/hurd/seteuids.c +index 3be772ae8b..8c4f5f2c20 100644 +--- a/hurd/seteuids.c ++++ b/hurd/seteuids.c +@@ -15,6 +15,7 @@ + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + ++#include <unistd.h> + #include <hurd.h> + #include <hurd/id.h> + +@@ -24,12 +25,20 @@ seteuids (size_t n, const uid_t *uids) + { + error_t err; + auth_t newauth; +- size_t i; +- gid_t new[n]; ++ size_t i, start; ++ uid_t euid; ++ uid_t new[n + 1]; + ++ start = 0; ++ euid = geteuid (); ++ if (euid != (uid_t) -1 && (n == 0 || (n > 0 && euid != uids[0]))) ++ { ++ new[0] = euid; ++ start = 1; ++ } + /* Fault before taking locks. */ + for (i = 0; i < n; ++i) +- new[i] = uids[i]; ++ new[i + start] = uids[i]; + + retry: + HURD_CRITICAL_BEGIN; +@@ -40,7 +49,7 @@ retry: + /* Get a new auth port using those IDs. */ + err = __USEPORT (AUTH, + __auth_makeauth (port, NULL, MACH_MSG_TYPE_COPY_SEND, 0, +- new, n, ++ new, n + start, + _hurd_id.aux.uids, _hurd_id.aux.nuids, + _hurd_id.gen.gids, _hurd_id.gen.ngids, + _hurd_id.aux.gids, _hurd_id.aux.ngids, +diff --git a/sysdeps/mach/hurd/setgroups.c b/sysdeps/mach/hurd/setgroups.c +index 5d71d89011..ddfed7cac5 100644 +--- a/sysdeps/mach/hurd/setgroups.c ++++ b/sysdeps/mach/hurd/setgroups.c +@@ -17,6 +17,7 @@ + + #include <errno.h> + #include <sys/types.h> ++#include <unistd.h> + #include <grp.h> + #include <hurd.h> + #include <hurd/id.h> +@@ -27,12 +28,20 @@ setgroups (size_t n, const gid_t *groups) + { + error_t err; + auth_t newauth; +- size_t i; +- gid_t new[n]; ++ size_t i, start; ++ gid_t egid; ++ gid_t new[n + 1]; + ++ start = 0; ++ egid = getegid (); ++ if (egid != (gid_t) -1 && (n == 0 || (n > 0 && egid != groups[0]))) ++ { ++ new[0] = egid; ++ start = 1; ++ } + /* Fault before taking locks. */ + for (i = 0; i < n; ++i) +- new[i] = groups[i]; ++ new[i + start] = groups[i]; + + retry: + HURD_CRITICAL_BEGIN; +@@ -45,7 +54,7 @@ retry: + __auth_makeauth (port, NULL, MACH_MSG_TYPE_COPY_SEND, 0, + _hurd_id.gen.uids, _hurd_id.gen.nuids, + _hurd_id.aux.uids, _hurd_id.aux.nuids, +- new, n, ++ new, n + start, + _hurd_id.aux.gids, _hurd_id.aux.ngids, + &newauth)); + } +-- +2.54.0 + +From 002a9d79d102fd65e6a277281a6cfd04bea5fc46 Mon Sep 17 00:00:00 2001 +From: Samuel Thibault <[email protected]> +Date: Sat, 10 Oct 2026 21:43:23 +0200 +Subject: [PATCH 4/4] hurd: Fix extra localplt + +--- + hurd/seteuids.c | 2 +- + sysdeps/mach/hurd/setgroups.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/hurd/seteuids.c b/hurd/seteuids.c +index 8c4f5f2c20..8c9d0dab68 100644 +--- a/hurd/seteuids.c ++++ b/hurd/seteuids.c +@@ -30,7 +30,7 @@ seteuids (size_t n, const uid_t *uids) + uid_t new[n + 1]; + + start = 0; +- euid = geteuid (); ++ euid = __geteuid (); + if (euid != (uid_t) -1 && (n == 0 || (n > 0 && euid != uids[0]))) + { + new[0] = euid; +diff --git a/sysdeps/mach/hurd/setgroups.c b/sysdeps/mach/hurd/setgroups.c +index ddfed7cac5..0aa1d3fe06 100644 +--- a/sysdeps/mach/hurd/setgroups.c ++++ b/sysdeps/mach/hurd/setgroups.c +@@ -33,7 +33,7 @@ setgroups (size_t n, const gid_t *groups) + gid_t new[n + 1]; + + start = 0; +- egid = getegid (); ++ egid = __getegid (); + if (egid != (gid_t) -1 && (n == 0 || (n > 0 && egid != groups[0]))) + { + new[0] = egid; +-- +2.54.0 +
