mirror of
https://github.com/stefanberger/swtpm.git
synced 2026-08-10 03:24:00 +00:00
swtpm: allow passing of uid numbers for user Ids.
Try to parse a userid as an integer first and only if that fails, interpret it as a name. Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
This commit is contained in:
parent
f4286d0a0e
commit
cebb1a9c1f
@ -83,30 +83,50 @@ err_exit:
|
||||
int
|
||||
change_process_owner(const char *user)
|
||||
{
|
||||
struct passwd *passwd = getpwnam(user);
|
||||
struct passwd *passwd;
|
||||
long int uid, gid;
|
||||
char *endptr = NULL;
|
||||
|
||||
if (!passwd) {
|
||||
logprintf(STDERR_FILENO,
|
||||
"Error: User '%s' does not exist.\n",
|
||||
user);
|
||||
return 14;
|
||||
uid = strtoul(user, &endptr, 10);
|
||||
if (*endptr != '\0') {
|
||||
/* a string */
|
||||
passwd = getpwnam(user);
|
||||
if (!passwd) {
|
||||
logprintf(STDERR_FILENO,
|
||||
"Error: User '%s' does not exist.\n",
|
||||
user);
|
||||
return 14;
|
||||
}
|
||||
|
||||
if (initgroups(passwd->pw_name, passwd->pw_gid) < 0) {
|
||||
logprintf(STDERR_FILENO,
|
||||
"Error: initgroups(%s, %d) failed.\n",
|
||||
passwd->pw_name, passwd->pw_gid);
|
||||
return -10;
|
||||
}
|
||||
gid = passwd->pw_gid;
|
||||
uid = passwd->pw_uid;
|
||||
} else {
|
||||
/* an integer */
|
||||
if ((unsigned long int)uid > UINT_MAX) {
|
||||
logprintf(STDERR_FILENO,
|
||||
"Error: uid %s outside valid range.\n",
|
||||
user);
|
||||
return -13;
|
||||
}
|
||||
gid = uid;
|
||||
}
|
||||
if (initgroups(passwd->pw_name, passwd->pw_gid) < 0) {
|
||||
logprintf(STDERR_FILENO,
|
||||
"Error: initgroups(%s, %d) failed.\n",
|
||||
passwd->pw_name, passwd->pw_gid);
|
||||
return -10;
|
||||
}
|
||||
if (setgid(passwd->pw_gid) < 0) {
|
||||
|
||||
if (setgid(gid) < 0) {
|
||||
logprintf(STDERR_FILENO,
|
||||
"Error: setgid(%d) failed.\n",
|
||||
passwd->pw_gid);
|
||||
gid);
|
||||
return -11;
|
||||
}
|
||||
if (setuid(passwd->pw_uid) < 0) {
|
||||
if (setuid(uid) < 0) {
|
||||
logprintf(STDERR_FILENO,
|
||||
"Error: setuid(%d) failed.\n",
|
||||
passwd->pw_uid);
|
||||
uid);
|
||||
return -12;
|
||||
}
|
||||
return 0;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user