aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2025-04-25 20:17:17 +0200
committerLudovic Courtès <ludo@gnu.org>2025-04-25 20:25:54 +0200
commit0d3bc50b0cffeae05beb12d0c270c6599186c0d7 (patch)
tree6bda5c169fcdf4e98e7609d39b5db33ab7fbd662
parent5529636006254c52d42b0a7755e651e42d0fb6c9 (diff)
downloadguix-0d3bc50b0cffeae05beb12d0c270c6599186c0d7.tar.gz
guix-0d3bc50b0cffeae05beb12d0c270c6599186c0d7.zip
daemon: Use the guest GID in /etc/group.
Partly fixes <https://issues.guix.gnu.org/77862>. Fixes a bug whereby, when running guix-daemon unprivileged, /etc/group would contain the wrong GID for the “nixbld” group. This inconsistency would lead to failures in the Coreutils test suite, for instance. * nix/libstore/build.cc (DerivationGoal::startBuilder): Use ‘guestGID’ when writing /etc/group. * tests/store.scm ("/etc/passwd and /etc/group"): New test. Reported-by: keinflue <keinflue@posteo.net> Change-Id: I739bc96c4c935fd9015a45e2bfe5b3e3f90554a9
-rw-r--r--nix/libstore/build.cc2
-rw-r--r--tests/store.scm22
2 files changed, 23 insertions, 1 deletions
diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc
index 4ee4a1ae5f..a1f39d9a8b 100644
--- a/nix/libstore/build.cc
+++ b/nix/libstore/build.cc
@@ -1854,7 +1854,7 @@ void DerivationGoal::startBuilder()
view of the system (e.g., "id -gn"). */
writeFile(chrootRootDir + "/etc/group",
(format("nixbld:!:%1%:\n")
- % (buildUser.enabled() ? buildUser.getGID() : getgid())).str());
+ % (buildUser.enabled() ? buildUser.getGID() : guestGID)).str());
/* Create /etc/hosts with localhost entry. */
if (!fixedOutput)
diff --git a/tests/store.scm b/tests/store.scm
index b467314bdc..112ea7e2fc 100644
--- a/tests/store.scm
+++ b/tests/store.scm
@@ -445,6 +445,28 @@
(unless (unprivileged-user-namespace-supported?)
(test-skip 1))
+(test-equal "/etc/passwd and /etc/group"
+ '((name "nixbld")
+ (uid 30001)
+ (gid 30000)
+ (group-name "nixbld"))
+ (let ((d (build-expression->derivation
+ %store "passwd-group-check"
+ `(call-with-output-file %output
+ (lambda (port)
+ ',(gettimeofday)
+ (let ((pw (getpwuid (getuid)))
+ (gr (getgrgid (getgid))))
+ (write `((name ,(passwd:name pw))
+ (uid ,(passwd:uid pw))
+ (gid ,(passwd:gid pw))
+ (group-name ,(group:name gr)))
+ port)))))))
+ (build-derivations %store (list d))
+ (call-with-input-file (derivation->output-path d) read)))
+
+(unless (unprivileged-user-namespace-supported?)
+ (test-skip 1))
(test-equal "inputs are read-only"
"All good!"
(let* ((input (plain-file (string-append "might-be-tampered-with-"