From: Jim Meyering Date: Fri, 6 Jul 2007 05:01:03 +0000 (+0000) Subject: * lib/getugroups.c (getugroups): Detect getgrent failure. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=66e59ae7e8b0bdb3dca761ff54cc48c071789dd9;p=pspp * lib/getugroups.c (getugroups): Detect getgrent failure. Adjust comment to reflect reality: this function may return -1. --- diff --git a/ChangeLog b/ChangeLog index dce04db7fb..4ea7df653a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-07-06 Jim Meyering + + * lib/getugroups.c (getugroups): Detect getgrent failure. + Adjust comment to reflect reality: this function may return -1. + 2007-07-05 Sergey Poznyakoff * build-aux/bootstrap (TP_URL,get_translations): Update to use diff --git a/lib/getugroups.c b/lib/getugroups.c index 43d0650a0f..7770ff038d 100644 --- a/lib/getugroups.c +++ b/lib/getugroups.c @@ -45,14 +45,13 @@ struct group *getgrent (); process. Store at most MAXCOUNT group IDs in the GROUPLIST array. If GID is not -1, store it first (if possible). GID should be the group ID (pw_gid) obtained from getpwuid, in case USERNAME is not - listed in /etc/groups. - Always return the number of groups of which USERNAME is a member. */ + listed in /etc/groups. Upon failure, set errno and return -1. + Otherwise, return the number of IDs we've written into GROUPLIST. */ int getugroups (int maxcount, GETGROUPS_T *grouplist, char const *username, gid_t gid) { - struct group *grp; int count = 0; if (gid != (gid_t) -1) @@ -63,9 +62,16 @@ getugroups (int maxcount, GETGROUPS_T *grouplist, char const *username, } setgrent (); - while ((grp = getgrent ()) != 0) + while (1) { char **cp; + struct group *grp; + + errno = 0; + grp = getgrent (); + if (grp == NULL) + break; + for (cp = grp->gr_mem; *cp; ++cp) { int n; @@ -91,13 +97,15 @@ getugroups (int maxcount, GETGROUPS_T *grouplist, char const *username, if (count < 0) { errno = EOVERFLOW; - count = -1; goto done; } } } } + if (errno != 0) + count = -1; + done: { int saved_errno = errno;