Index: shadow-4.5/src/newgrp.c =================================================================== --- shadow-4.5.orig/src/newgrp.c +++ shadow-4.5/src/newgrp.c @@ -83,15 +83,29 @@ static void usage (void) } } +static bool ingroup(const char *name, 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 given group id for + * 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, gid_t gid) +static /*@null@*/struct group *find_matching_group (const char *name, struct group *gr) { - struct group *gr; - char **look; - bool notfound = true; + gid_t gid = gr->gr_gid; + + if (ingroup(name, gr)) + return gr; setgrent (); while ((gr = getgrent ()) != NULL) { @@ -103,14 +117,8 @@ static /*@null@*/struct group *find_matc * 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; @@ -630,7 +638,7 @@ 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); + grp = find_matching_group (name, grp); if (NULL == grp) { /* * No matching group found. As we already know that