diff options
author | Andreas Schwab <schwab@suse.de> | 2016-06-16 12:44:29 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2016-08-18 15:24:53 +0200 |
commit | a8c871a8714b968b1a1e3e679919a2125fc968f3 (patch) | |
tree | 90f33d882c5b191a8c57fec19d36f1a9a0bb2fce | |
parent | a85abfa92220239cad0a8a6b0f2a223f5e6472a9 (diff) | |
download | glibc-a8c871a8714b968b1a1e3e679919a2125fc968f3.tar.gz glibc-a8c871a8714b968b1a1e3e679919a2125fc968f3.tar.xz glibc-a8c871a8714b968b1a1e3e679919a2125fc968f3.zip |
Return proper status from _nss_nis_initgroups_dyn (bug 20262)
(cherry picked from commit 73fb56a4d51fd4437e4cde6dd3c8077a610f88a8)
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | nis/nss_nis/nis-initgroups.c | 16 |
2 files changed, 18 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index c2a91e1c2b..3541385d5b 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-08-15 Andreas Schwab <schwab@suse.de> [BZ #20435] diff --git a/nis/nss_nis/nis-initgroups.c b/nis/nss_nis/nis-initgroups.c index ed5c26b20d..5845b6d1aa 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) |