]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
getent: Use dynarray in initgroups_keys [BZ #18023]
authorFlorian Weimer <fweimer@redhat.com>
Mon, 25 Jun 2018 17:22:46 +0000 (19:22 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Mon, 25 Jun 2018 17:47:59 +0000 (19:47 +0200)
ChangeLog
nss/getent.c

index a2fc4b793f41630b9b100ae3bf798dcd9d0243b5..b0159351952c6b97bb86180fabc01e5f57e064af 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-06-25  Florian Weimer  <fweimer@redhat.com>
+
+       [BZ #18023]
+       * nss/getent.c (initgroups_keys): Use dynarray instead of
+       extend_alloca.
+
 2018-06-25  Florian Weimer  <fweimer@redhat.com>
 
        [BZ #18023]
index e609e5f9bb62a70ff1a1a4c0d29480f7e1cf12b1..92ade41d7515e4334e228c34f22433bde63ea24f 100644 (file)
@@ -39,6 +39,7 @@
 #include <netinet/ether.h>
 #include <netinet/in.h>
 #include <sys/socket.h>
+#include <scratch_buffer.h>
 
 /* Get libc version number.  */
 #include <version.h>
@@ -473,34 +474,51 @@ netgroup_keys (int number, char *key[])
   return result;
 }
 
+#define DYNARRAY_STRUCT gid_list
+#define DYNARRAY_ELEMENT gid_t
+#define DYNARRAY_PREFIX gid_list_
+#define DYNARRAY_INITIAL_SIZE 10
+#include <malloc/dynarray-skeleton.c>
+
 /* This is for initgroups */
 static int
 initgroups_keys (int number, char *key[])
 {
-  int ngrps = 100;
-  size_t grpslen = ngrps * sizeof (gid_t);
-  gid_t *grps = alloca (grpslen);
-
   if (number == 0)
     {
       fprintf (stderr, _("Enumeration not supported on %s\n"), "initgroups");
       return 3;
     }
 
+  struct gid_list list;
+  gid_list_init (&list);
+  if (!gid_list_resize (&list, 10))
+    {
+      fprintf (stderr, _("Could not allocate group list: %m\n"));
+      return 3;
+    }
+
   for (int i = 0; i < number; ++i)
     {
-      int no = ngrps;
+      int no = gid_list_size (&list);
       int n;
-      while ((n = getgrouplist (key[i], -1, grps, &no)) == -1
-            && no > ngrps)
+      while ((n = getgrouplist (key[i], -1, gid_list_begin (&list), &no)) == -1
+            && no > gid_list_size (&list))
        {
-         grps = extend_alloca (grps, grpslen, no * sizeof (gid_t));
-         ngrps = no;
+         if (!gid_list_resize (&list, no))
+           {
+             fprintf (stderr, _("Could not allocate group list: %m\n"));
+             return 3;
+           }
        }
 
       if (n == -1)
-       return 1;
+       {
+         gid_list_free (&list);
+         return 1;
+       }
 
+      const gid_t *grps = gid_list_begin (&list);
       printf ("%-21s", key[i]);
       for (int j = 0; j < n; ++j)
        if (grps[j] != -1)
@@ -508,6 +526,8 @@ initgroups_keys (int number, char *key[])
       putchar_unlocked ('\n');
     }
 
+  gid_list_free (&list);
+
   return 0;
 }