bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

getugroups nit


From: Jim Meyering
Subject: getugroups nit
Date: Fri, 06 Jul 2007 07:03:32 +0200

getugroups could fail (due to getgrent), but the caller
would have no way to know that.

        * lib/getugroups.c (getugroups): Detect getgrent failure.
        Adjust comment to reflect reality: this function may return -1.

Index: lib/getugroups.c
===================================================================
RCS file: /cvsroot/gnulib/gnulib/lib/getugroups.c,v
retrieving revision 1.20
diff -u -p -r1.20 getugroups.c
--- lib/getugroups.c    5 Jul 2007 08:06:33 -0000       1.20
+++ lib/getugroups.c    5 Jul 2007 13:52:31 -0000
@@ -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 groups of which USERNAME is a member.  */

 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 *g
     }

   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 *g
              if (count < 0)
                {
                  errno = EOVERFLOW;
-                 count = -1;
                  goto done;
                }
            }
        }
     }

+  if (errno != 0)
+    count = -1;
+
  done:
   {
     int saved_errno = errno;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]