diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2022-09-12 22:24:01 +1000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2022-09-13 05:31:51 +0200 |
commit | 80d7012b09cddbf6b8bb0d002af5f4645ad5c450 (patch) | |
tree | b384ab451f8bbc8856636b66a276453c3d6c051f /util.c | |
parent | 10c63477476acdd5cbe6f3ac13dc637e80d0104b (diff) | |
download | passt-80d7012b09cddbf6b8bb0d002af5f4645ad5c450.tar passt-80d7012b09cddbf6b8bb0d002af5f4645ad5c450.tar.gz passt-80d7012b09cddbf6b8bb0d002af5f4645ad5c450.tar.bz2 passt-80d7012b09cddbf6b8bb0d002af5f4645ad5c450.tar.lz passt-80d7012b09cddbf6b8bb0d002af5f4645ad5c450.tar.xz passt-80d7012b09cddbf6b8bb0d002af5f4645ad5c450.tar.zst passt-80d7012b09cddbf6b8bb0d002af5f4645ad5c450.zip |
Consolidate determination of UID/GID to run as
Currently the logic to work out what UID and GID we will run as is spread
across conf(). If --runas is specified it's handled in conf_runas(),
otherwise it's handled by check_root(), which depends on initialization of
the uid and gid variables by either conf() itself or conf_runas().
Make this clearer by putting all the UID and GID logic into a single
conf_ugid() function.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 50 |
1 files changed, 0 insertions, 50 deletions
@@ -483,56 +483,6 @@ void drop_caps(void) } /** - * check_root() - Check if root in init ns, exit if we can't drop to user - */ -void check_root(uid_t *uid, gid_t *gid) -{ - const char root_uid_map[] = " 0 0 4294967295"; - struct passwd *pw; - char buf[BUFSIZ]; - int fd; - - if (!*uid) - *uid = geteuid(); - - if (!*gid) - *gid = getegid(); - - if (*uid) - return; - - if ((fd = open("/proc/self/uid_map", O_RDONLY | O_CLOEXEC)) < 0) - return; - - if (read(fd, buf, BUFSIZ) != sizeof(root_uid_map) || - strncmp(buf, root_uid_map, sizeof(root_uid_map) - 1)) { - close(fd); - return; - } - - close(fd); - - if (!*uid) { - fprintf(stderr, "Don't run as root. Changing to nobody...\n"); -#ifndef GLIBC_NO_STATIC_NSS - pw = getpwnam("nobody"); - if (!pw) { - perror("getpwnam"); - exit(EXIT_FAILURE); - } - - *uid = pw->pw_uid; - *gid = pw->pw_gid; -#else - (void)pw; - - /* Common value for 'nobody', not really specified */ - *uid = *gid = 65534; -#endif - } -} - -/** * drop_root() - Switch to given UID and GID * @uid: User ID to switch to * @gid: Group ID to switch to |