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;