X-Git-Url: http://andersk.mit.edu/gitweb/nss_nonlocal.git/blobdiff_plain/f943c4ed9faad1a9cad18269eabd2fd456e82c20..d905b3694128b82d2f9e7dfa5155ee281ac07be2:/nonlocal-group.c diff --git a/nonlocal-group.c b/nonlocal-group.c index 9d2bfa0..085fafd 100644 --- a/nonlocal-group.c +++ b/nonlocal-group.c @@ -97,12 +97,22 @@ check_nonlocal_gid(const char *user, gid_t gid, int *errnop) nip = startp; fct.ptr = fct_start; do { + morebuf: if (fct.l == _nss_nonlocal_getgrgid_r) status = NSS_STATUS_NOTFOUND; else status = DL_CALL_FCT(fct.l, (gid, &gbuf, buf, buflen, errnop)); - if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) - break; + if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) { + free(buf); + buflen *= 2; + buf = malloc(buflen); + if (buf == NULL) { + *errnop = ENOMEM; + errno = old_errno; + return NSS_STATUS_TRYAGAIN; + } + goto morebuf; + } } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0); if (status == NSS_STATUS_SUCCESS) { @@ -149,12 +159,22 @@ get_local_group(const char *name, struct group *grp, char *buffer, size_t buflen nip = startp; fct.ptr = fct_start; do { + morebuf: if (fct.l == _nss_nonlocal_getgrnam_r) status = NSS_STATUS_NOTFOUND; else - status = DL_CALL_FCT(fct.l, (name, &gbuf, buf, buflen, errnop)); - if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) - break; + status = DL_CALL_FCT(fct.l, (name, &gbuf, buf, len, errnop)); + if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) { + free(buf); + len *= 2; + buf = malloc(len); + if (buf == NULL) { + *errnop = ENOMEM; + errno = old_errno; + return NSS_STATUS_TRYAGAIN; + } + goto morebuf; + } } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0); if (status != NSS_STATUS_SUCCESS) @@ -473,7 +493,7 @@ _nss_nonlocal_initgroups_dyn(const char *user, gid_t group, long int *start, if (newsize > limit) newsize = limit; } - newgroups = realloc(*groupsp, *size * sizeof((*groupsp)[0])); + newgroups = realloc(*groupsp, newsize * sizeof((*groupsp)[0])); if (newgroups == NULL) { *errnop = ENOMEM; errno = old_errno;