aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@suse.de>2016-06-16 12:44:29 +0200
committerRyan S. Arnold <ryan.arnold@linaro.org>2016-10-22 11:49:09 -0500
commit679988f02255d3d70eaffbb0e02c052a8b322656 (patch)
treedc4fb1455685665b93d8856d3c6f96772ba76d05
parent41f8b8f92e667e490d9eaa427a4a2412d6f1ede4 (diff)
downloadglibc-679988f02255d3d70eaffbb0e02c052a8b322656.tar
glibc-679988f02255d3d70eaffbb0e02c052a8b322656.tar.gz
glibc-679988f02255d3d70eaffbb0e02c052a8b322656.tar.bz2
glibc-679988f02255d3d70eaffbb0e02c052a8b322656.zip
Return proper status from _nss_nis_initgroups_dyn (bug 20262)
(cherry picked from commit 73fb56a4d51fd4437e4cde6dd3c8077a610f88a8)
-rw-r--r--ChangeLog7
-rw-r--r--nis/nss_nis/nis-initgroups.c16
2 files changed, 18 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index f61470fb71..c2191da87e 100644
--- 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]
diff --git a/nis/nss_nis/nis-initgroups.c b/nis/nss_nis/nis-initgroups.c
index dec385cec7..0368667cf6 100644
--- a/nis/nss_nis/nis-initgroups.c
+++ b/nis/nss_nis/nis-initgroups.c
@@ -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)