aboutsummaryrefslogtreecommitdiff
path: root/os-posix.c
diff options
context:
space:
mode:
authorMichael Tokarev <mjt@tls.msk.ru>2023-09-01 13:12:56 +0300
committerPaolo Bonzini <pbonzini@redhat.com>2023-09-01 23:46:17 +0200
commit22d0251570d505681d7bba6a00bcae08f962189d (patch)
tree8e179071173b68e01da745196fe667e5fc855553 /os-posix.c
parentb21bdbb51a3b71d6fa7660d761a9bf89c34d951c (diff)
os-posix.c: create and export os_set_runas()
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20230901101302.3618955-3-mjt@tls.msk.ru> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'os-posix.c')
-rw-r--r--os-posix.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/os-posix.c b/os-posix.c
index cfcb96533c..f0ee5c8b00 100644
--- a/os-posix.c
+++ b/os-posix.c
@@ -102,8 +102,14 @@ void os_set_proc_name(const char *s)
#endif
}
-
-static bool os_parse_runas_uid_gid(const char *optarg)
+/*
+ * Prepare to change user ID. optarg can be one of 3 forms:
+ * - a username, in which case user ID will be changed to its uid,
+ * with primary and supplementary groups set up too;
+ * - a numeric uid, in which case only the uid will be set;
+ * - a pair of numeric uid:gid.
+ */
+bool os_set_runas(const char *optarg)
{
unsigned long lv;
const char *ep;
@@ -111,6 +117,13 @@ static bool os_parse_runas_uid_gid(const char *optarg)
gid_t got_gid;
int rc;
+ user_pwd = getpwnam(optarg);
+ if (user_pwd) {
+ user_uid = -1;
+ user_gid = -1;
+ return true;
+ }
+
rc = qemu_strtoul(optarg, &ep, 0, &lv);
got_uid = lv; /* overflow here is ID in C99 */
if (rc || *ep != ':' || got_uid != lv || got_uid == (uid_t)-1) {
@@ -137,11 +150,7 @@ int os_parse_cmd_args(int index, const char *optarg)
{
switch (index) {
case QEMU_OPTION_runas:
- user_pwd = getpwnam(optarg);
- if (user_pwd) {
- user_uid = -1;
- user_gid = -1;
- } else if (!os_parse_runas_uid_gid(optarg)) {
+ if (!os_set_runas(optarg)) {
error_report("User \"%s\" doesn't exist"
" (and is not <uid>:<gid>)",
optarg);