aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2023-04-11 12:42:36 -0400
committerEli Schwartz <eschwartz@archlinux.org>2023-04-14 15:13:12 -0400
commit3bc2236c59249f44f20f8b52ddcd7a44938ea2f0 (patch)
treeb75cadd0b3a3a78003062d9d823f79d9cdf4b7d3 /mesonbuild
parent9a77c45e4192df1b89a3631aa3ce379922c4bf5c (diff)
downloadmeson-3bc2236c59249f44f20f8b52ddcd7a44938ea2f0.zip
meson-3bc2236c59249f44f20f8b52ddcd7a44938ea2f0.tar.gz
meson-3bc2236c59249f44f20f8b52ddcd7a44938ea2f0.tar.bz2
minstall: work around broken environments with missing UIDs
Running some container-like mechanisms such as chroot(1) from sudo, can result in a new isolated environment where the environment variables exist but no users exist. From there, a build is performed as root but installation fails when we try to look up the passwd database entry for the user outside of the chroot. Proper container mechanisms such as systemd-nspawn, and even improper ones like docker, sanitize this and ensure those stale environment variables don't exist anymore. But chroot is very low-level. Avoid crashing when this happens. Fixes #11662
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/minstall.py12
1 files changed, 10 insertions, 2 deletions
diff --git a/mesonbuild/minstall.py b/mesonbuild/minstall.py
index 04726b0..b9fe7d5 100644
--- a/mesonbuild/minstall.py
+++ b/mesonbuild/minstall.py
@@ -778,10 +778,18 @@ def rebuild_all(wd: str, backend: str) -> bool:
orig_user = env.pop('SUDO_USER')
orig_uid = env.pop('SUDO_UID', 0)
orig_gid = env.pop('SUDO_GID', 0)
- homedir = pwd.getpwuid(int(orig_uid)).pw_dir
+ try:
+ homedir = pwd.getpwuid(int(orig_uid)).pw_dir
+ except KeyError:
+ # `sudo chroot` leaves behind stale variable and builds as root without a user
+ return None, None
elif os.environ.get('DOAS_USER') is not None:
orig_user = env.pop('DOAS_USER')
- pwdata = pwd.getpwnam(orig_user)
+ try:
+ pwdata = pwd.getpwnam(orig_user)
+ except KeyError:
+ # `doas chroot` leaves behind stale variable and builds as root without a user
+ return None, None
orig_uid = pwdata.pw_uid
orig_gid = pwdata.pw_gid
homedir = pwdata.pw_dir