aboutgitcodebugslistschat
path: root/conf.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2022-09-12 22:24:02 +1000
committerStefano Brivio <sbrivio@redhat.com>2022-09-13 05:31:51 +0200
commit5d3b50c1006590c4b5aab7339203880caa8f2525 (patch)
treea4eaa005dfa263b5a4bebad13033ac3ef01faee7 /conf.c
parent80d7012b09cddbf6b8bb0d002af5f4645ad5c450 (diff)
downloadpasst-5d3b50c1006590c4b5aab7339203880caa8f2525.tar
passt-5d3b50c1006590c4b5aab7339203880caa8f2525.tar.gz
passt-5d3b50c1006590c4b5aab7339203880caa8f2525.tar.bz2
passt-5d3b50c1006590c4b5aab7339203880caa8f2525.tar.lz
passt-5d3b50c1006590c4b5aab7339203880caa8f2525.tar.xz
passt-5d3b50c1006590c4b5aab7339203880caa8f2525.tar.zst
passt-5d3b50c1006590c4b5aab7339203880caa8f2525.zip
Safer handling if we can't open /proc/self/uid_map
passt is allowed to run as "root" (UID 0) in a user namespace, but notas real root in the init namespace. We read /proc/self/uid_map to determine if we're in the init namespace or not. If we're unable to open /proc/self/uid_map we assume we're ok and continue running as UID 0. This seems unwise. The only instances I can think of where uid_map won't be available are if the host kernel doesn't support namespaces, or /proc is not mounted. In neither case is it safe to assume we're "not really" root and continue (although in practice we'd likely fail for other reasons pretty soon anyway). Therefore, fail with an error in this case, instead of carrying on. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'conf.c')
-rw-r--r--conf.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/conf.c b/conf.c
index a97e055..b669f5d 100644
--- a/conf.c
+++ b/conf.c
@@ -1054,8 +1054,12 @@ static int conf_ugid(const char *runas, uid_t *uid, gid_t *gid)
return 0;
/* ...or at least not root in the init namespace... */
- if ((fd = open("/proc/self/uid_map", O_RDONLY | O_CLOEXEC)) < 0)
- return 0;
+ if ((fd = open("/proc/self/uid_map", O_RDONLY | O_CLOEXEC)) < 0) {
+ ret = -errno;
+ err("Can't determine if we're in init namespace: %s",
+ strerror(-ret));
+ return ret;
+ }
if (read(fd, buf, BUFSIZ) != sizeof(root_uid_map) ||
strncmp(buf, root_uid_map, sizeof(root_uid_map) - 1)) {