Mercurial > hg > octave-lyh > gnulib-hg
changeset 9049:da9a878d7b51
* lib/getugroups.c (getugroups): Detect getgrent failure.
Adjust comment to reflect reality: this function may return -1.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Fri, 06 Jul 2007 05:01:03 +0000 |
parents | 01955222b832 |
children | 9a948e3ed584 |
files | ChangeLog lib/getugroups.c |
diffstat | 2 files changed, 18 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-07-06 Jim Meyering <jim@meyering.net> + + * lib/getugroups.c (getugroups): Detect getgrent failure. + Adjust comment to reflect reality: this function may return -1. + 2007-07-05 Sergey Poznyakoff <gray@gnu.org.ua> * build-aux/bootstrap (TP_URL,get_translations): Update to use
--- a/lib/getugroups.c +++ b/lib/getugroups.c @@ -45,14 +45,13 @@ 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 @@ } 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 @@ if (count < 0) { errno = EOVERFLOW; - count = -1; goto done; } } } } + if (errno != 0) + count = -1; + done: { int saved_errno = errno;