]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Return proper status from _nss_nis_initgroups_dyn (bug 20262)
authorAndreas Schwab <schwab@suse.de>
Thu, 16 Jun 2016 10:44:29 +0000 (12:44 +0200)
committerRyan S. Arnold <ryan.arnold@linaro.org>
Sat, 22 Oct 2016 16:49:09 +0000 (11:49 -0500)
(cherry picked from commit 73fb56a4d51fd4437e4cde6dd3c8077a610f88a8)

ChangeLog
nis/nss_nis/nis-initgroups.c

index f61470fb71ed714199d8ad8ffa6176cda2cec05d..c2191da87e72811fd4e23fc7fd347e205ed6f971 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2016-06-30  Andreas Schwab  <schwab@suse.de>
+
+       [BZ #20262]
+       * nis/nss_nis/nis-initgroups.c (_nss_nis_initgroups_dyn): Return
+       NSS_STATUS_SUCCESS when done.  Return NSS_STATUS_TRYAGAIN when out
+       of memory.
+
 2016-06-21  Florian Weimer  <fweimer@redhat.com>
 
        [BZ #20284]
index dec385cec7ae3b64d92c6e2938e99baf0ecff443..0368667cf630eb4f0cbe5d6383945bfbb249ef4a 100644 (file)
@@ -266,7 +266,7 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
 
   tmpbuf = __alloca (buflen);
 
-  do
+  while (1)
     {
       while ((status =
              internal_getgrent_r (&grpbuf, tmpbuf, buflen, errnop,
@@ -275,8 +275,11 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
        tmpbuf = extend_alloca (tmpbuf, buflen, 2 * buflen);
 
       if (status != NSS_STATUS_SUCCESS)
-       goto done;
-
+       {
+         if (status == NSS_STATUS_NOTFOUND)
+           status = NSS_STATUS_SUCCESS;
+         goto done;
+       }
 
       g = &grpbuf;
       if (g->gr_gid != group)
@@ -304,7 +307,11 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
 
                    newgroups = realloc (groups, newsize * sizeof (*groups));
                    if (newgroups == NULL)
-                     goto done;
+                     {
+                       status = NSS_STATUS_TRYAGAIN;
+                       *errnop = errno;
+                       goto done;
+                     }
                    *groupsp = groups = newgroups;
                     *size = newsize;
                   }
@@ -316,7 +323,6 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
               }
         }
     }
-  while (status == NSS_STATUS_SUCCESS);
 
 done:
   while (intern.start != NULL)