Don't assume that getgrnam() calls don't modify contents of
struct passwd returned by getpwnam(). On FreeBSD w/ NIS this can happen. Based on a patch from Kirk Webb.
This commit is contained in:
18
parse.c
18
parse.c
@@ -443,25 +443,27 @@ usergr_matches(group, user)
|
||||
{
|
||||
struct group *grp;
|
||||
struct passwd *pw;
|
||||
gid_t pw_gid;
|
||||
char **cur;
|
||||
|
||||
/* make sure we have a valid usergroup, sudo style */
|
||||
if (*group++ != '%')
|
||||
return(FALSE);
|
||||
|
||||
/* look up user's primary gid in the passwd file (XXX - reduce lookups) */
|
||||
if ((pw = getpwnam(user)) == NULL)
|
||||
return(FALSE);
|
||||
pw_gid = pw->pw_gid;
|
||||
|
||||
if ((grp = getgrnam(group)) == NULL)
|
||||
return(FALSE);
|
||||
|
||||
/*
|
||||
* Check against user's real gid as well as group's user list
|
||||
*/
|
||||
if ((pw = getpwnam(user)) == NULL)
|
||||
return(FALSE);
|
||||
|
||||
if (grp->gr_gid == pw->pw_gid)
|
||||
/* check against user's primary (passwd file) gid */
|
||||
if (grp->gr_gid == pw_gid)
|
||||
return(TRUE);
|
||||
|
||||
for (cur=grp->gr_mem; *cur; cur++) {
|
||||
/* check to see if user is explicitly listed in the group */
|
||||
for (cur = grp->gr_mem; *cur; cur++) {
|
||||
if (strcmp(*cur, user) == 0)
|
||||
return(TRUE);
|
||||
}
|
||||
|
Reference in New Issue
Block a user