diff options
author | Eli Schwartz <eschwartz@archlinux.org> | 2023-04-11 12:42:36 -0400 |
---|---|---|
committer | Eli Schwartz <eschwartz@archlinux.org> | 2023-04-14 15:13:12 -0400 |
commit | 3bc2236c59249f44f20f8b52ddcd7a44938ea2f0 (patch) | |
tree | b75cadd0b3a3a78003062d9d823f79d9cdf4b7d3 /mesonbuild | |
parent | 9a77c45e4192df1b89a3631aa3ce379922c4bf5c (diff) | |
download | meson-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.py | 12 |
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 |