environment: '-C' doesn't throw when the NSS is dysfunctional.

Previously, if the name service switch was dysfunctional, as can happen
on foreign distros lacking nscd, "guix shell -C" would crash with a
backtrace on the uncaught 'getpwuid' exception.  To address that, catch
the exception and deal with it gracefully.

Reported by remsd1 on #guix.

* guix/scripts/environment.scm (launch-environment/container): Wrap
'getpwuid' call in 'false-if-exception'.
This commit is contained in:
Ludovic Courtès 2022-12-08 16:30:52 +01:00
parent 3405b2b16c
commit e625e9b194
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -728,14 +728,21 @@ (define fhs-mappings
(home (getenv "HOME")) (home (getenv "HOME"))
(uid (if user 1000 (getuid))) (uid (if user 1000 (getuid)))
(gid (if user 1000 (getgid))) (gid (if user 1000 (getgid)))
(passwd (let ((pwd (getpwuid (getuid))))
;; On a foreign distro, the name service switch might be
;; dysfunctional and 'getpwuid' throws. Don't let that hamper
;; operations.
(passwd (let ((pwd (false-if-exception (getpwuid (getuid)))))
(password-entry (password-entry
(name (or user (passwd:name pwd))) (name (or user
(real-name (if user (and=> pwd passwd:name)
(getenv "USER")
"charlie"))
(real-name (if (or user (not pwd))
"" ""
(passwd:gecos pwd))) (passwd:gecos pwd)))
(uid uid) (gid gid) (shell bash) (uid uid) (gid gid) (shell bash)
(directory (if user (directory (if (or user (not pwd))
(string-append "/home/" user) (string-append "/home/" user)
(passwd:dir pwd)))))) (passwd:dir pwd))))))
(groups (list (group-entry (name "users") (gid gid)) (groups (list (group-entry (name "users") (gid gid))