diff lib/getugroups.c @ 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 (2007-07-06)
parents 11f2466d2f5b
children bbbbbf4cd1c5
line wrap: on
line diff
--- 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;