Merge pull request #82 from t8m/ingroup

newgrp: avoid unnecessary group lookups
This commit is contained in:
Serge Hallyn 2017-10-06 17:45:31 -05:00 committed by GitHub
commit 0c2939b331

View File

@ -83,16 +83,30 @@ static void usage (void)
}
}
/*
* find_matching_group - search all groups of a given group id for
* membership of a given username
*/
static /*@null@*/struct group *find_matching_group (const char *name, gid_t gid)
static bool ingroup(const char *name, struct group *gr)
{
struct group *gr;
char **look;
bool notfound = true;
look = gr->gr_mem;
while (*look && notfound)
notfound = strcmp (*look++, name);
return !notfound;
}
/*
* find_matching_group - search all groups of a gr's group id for
* membership of a given username
* but check gr itself first
*/
static /*@null@*/struct group *find_matching_group (const char *name, struct group *gr)
{
gid_t gid = gr->gr_gid;
if (ingroup(name, gr))
return gr;
setgrent ();
while ((gr = getgrent ()) != NULL) {
if (gr->gr_gid != gid) {
@ -103,15 +117,9 @@ static /*@null@*/struct group *find_matching_group (const char *name, gid_t gid)
* A group with matching GID was found.
* Test for membership of 'name'.
*/
look = gr->gr_mem;
while ((NULL != *look) && notfound) {
notfound = (strcmp (*look, name) != 0);
look++;
}
if (!notfound) {
if (ingroup(name, gr))
break;
}
}
endgrent ();
return gr;
}
@ -643,7 +651,8 @@ int main (int argc, char **argv)
* groups of the same GID like the requested group for
* membership of the current user.
*/
grp = find_matching_group (name, grp->gr_gid);
if (!is_member) {
grp = find_matching_group (name, grp);
if (NULL == grp) {
/*
* No matching group found. As we already know that
@ -655,6 +664,7 @@ int main (int argc, char **argv)
grp = xgetgrnam (group);
assert (NULL != grp);
}
}
#ifdef SHADOWGRP
sgrp = getsgnam (group);
if (NULL != sgrp) {