Reference count cached passwd and group structs. The cache holds
one reference itself and another is added by sudo_getgr{gid,nam} and sudo_getpw{uid,nam}. The final ref on the runas and user passwd and group structs are persistent for now.
This commit is contained in:
@@ -406,6 +406,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
||||
log_error(0, "timestamp owner (%s): No such user",
|
||||
def_timestampowner);
|
||||
timestamp_uid = pw->pw_uid;
|
||||
pw_delref(pw);
|
||||
}
|
||||
|
||||
/* If given the -P option, set the "preserve_groups" flag. */
|
||||
@@ -459,6 +460,8 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
||||
struct passwd *pw;
|
||||
|
||||
if ((pw = sudo_getpwnam(prev_user)) != NULL) {
|
||||
if (sudo_user.pw != NULL)
|
||||
pw_delref(sudo_user.pw);
|
||||
sudo_user.pw = pw;
|
||||
#ifdef HAVE_MBR_CHECK_MEMBERSHIP
|
||||
mbr_uid_to_uuid(user_uid, user_uuid);
|
||||
@@ -1066,12 +1069,14 @@ set_fqdn(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* Get passwd entry for the user we are going to run commands as.
|
||||
* By default, this is "root". Updates runas_pw as a side effect.
|
||||
* Get passwd entry for the user we are going to run commands as
|
||||
* and store it in runas_pw. By default, commands run as "root".
|
||||
*/
|
||||
static void
|
||||
set_runaspw(char *user)
|
||||
{
|
||||
if (runas_pw != NULL)
|
||||
pw_delref(runas_pw);
|
||||
if (*user == '#') {
|
||||
if ((runas_pw = sudo_getpwuid(atoi(user + 1))) == NULL)
|
||||
runas_pw = sudo_fakepwnam(user, runas_gr ? runas_gr->gr_gid : 0);
|
||||
@@ -1084,12 +1089,14 @@ set_runaspw(char *user)
|
||||
}
|
||||
|
||||
/*
|
||||
* Get group entry for the group we are going to run commands as.
|
||||
* Updates runas_pw as a side effect.
|
||||
* Get group entry for the group we are going to run commands as
|
||||
* and store it in runas_gr.
|
||||
*/
|
||||
static void
|
||||
set_runasgr(char *group)
|
||||
{
|
||||
if (runas_gr != NULL)
|
||||
gr_delref(runas_gr);
|
||||
if (*group == '#') {
|
||||
if ((runas_gr = sudo_getgrgid(atoi(group + 1))) == NULL)
|
||||
runas_gr = sudo_fakegrnam(group);
|
||||
@@ -1119,9 +1126,12 @@ get_authpw(void)
|
||||
if (runas_pw->pw_name == NULL)
|
||||
log_error(NO_MAIL|MSG_ONLY, "unknown uid: %lu",
|
||||
(unsigned long) runas_pw->pw_uid);
|
||||
pw_addref(runas_pw);
|
||||
pw = runas_pw;
|
||||
} else
|
||||
} else {
|
||||
pw_addref(sudo_user.pw);
|
||||
pw = sudo_user.pw;
|
||||
}
|
||||
|
||||
return(pw);
|
||||
}
|
||||
|
Reference in New Issue
Block a user