--- embedaddon/sudo/plugins/sudoers/match.c 2012/05/29 12:26:49 1.1.1.2 +++ embedaddon/sudo/plugins/sudoers/match.c 2012/10/09 09:29:52 1.1.1.3 @@ -154,7 +154,9 @@ userlist_matches(struct passwd *pw, struct member_list * Returns ALLOW, DENY or UNSPEC. */ static int -_runaslist_matches(struct member_list *user_list, struct member_list *group_list) +_runaslist_matches(struct member_list *user_list, + struct member_list *group_list, struct member **matching_user, + struct member **matching_group) { struct member *m; struct alias *a; @@ -183,7 +185,8 @@ _runaslist_matches(struct member_list *user_list, stru break; case ALIAS: if ((a = alias_find(m->name, RUNASALIAS)) != NULL) { - rval = _runaslist_matches(&a->members, &empty); + rval = _runaslist_matches(&a->members, &empty, + matching_user, NULL); if (rval != UNSPEC) user_matched = m->negated ? !rval : rval; break; @@ -193,9 +196,17 @@ _runaslist_matches(struct member_list *user_list, stru if (userpw_matches(m->name, runas_pw->pw_name, runas_pw)) user_matched = !m->negated; break; + case MYSELF: + if (!ISSET(sudo_user.flags, RUNAS_USER_SPECIFIED) || + strcmp(user_name, runas_pw->pw_name) == 0) + user_matched = !m->negated; + break; } - if (user_matched != UNSPEC) + if (user_matched != UNSPEC) { + if (matching_user != NULL && m->type != ALIAS) + *matching_user = m; break; + } } } @@ -211,7 +222,8 @@ _runaslist_matches(struct member_list *user_list, stru break; case ALIAS: if ((a = alias_find(m->name, RUNASALIAS)) != NULL) { - rval = _runaslist_matches(&empty, &a->members); + rval = _runaslist_matches(&empty, &a->members, + NULL, matching_group); if (rval != UNSPEC) group_matched = m->negated ? !rval : rval; break; @@ -222,8 +234,11 @@ _runaslist_matches(struct member_list *user_list, stru group_matched = !m->negated; break; } - if (group_matched != UNSPEC) + if (group_matched != UNSPEC) { + if (matching_group != NULL && m->type != ALIAS) + *matching_group = m; break; + } } if (group_matched == UNSPEC) { if (runas_pw != NULL && runas_pw->pw_gid == runas_gr->gr_gid) @@ -239,11 +254,13 @@ _runaslist_matches(struct member_list *user_list, stru } int -runaslist_matches(struct member_list *user_list, struct member_list *group_list) +runaslist_matches(struct member_list *user_list, + struct member_list *group_list, struct member **matching_user, + struct member **matching_group) { alias_seqno++; return _runaslist_matches(user_list ? user_list : &empty, - group_list ? group_list : &empty); + group_list ? group_list : &empty, matching_user, matching_group); } /* @@ -700,7 +717,7 @@ usergr_matches(char *group, char *user, struct passwd done: if (pw0 != NULL) - pw_delref(pw0); + sudo_pw_delref(pw0); debug_return_bool(matched); }