X-Git-Url: http://andersk.mit.edu/gitweb/nss_nonlocal.git/blobdiff_plain/c1812233bd33cfa20fdf4a90869ab3e157583307..8870ee9ca4ea1fbe316f18448d5c73f31ad729c7:/nonlocal-passwd.c diff --git a/nonlocal-passwd.c b/nonlocal-passwd.c index 80708dc..e915ea0 100644 --- a/nonlocal-passwd.c +++ b/nonlocal-passwd.c @@ -79,7 +79,7 @@ check_nonlocal_uid(const char *user, uid_t uid, int *errnop) struct passwd pwbuf; int old_errno = errno; - int buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); char *buf = malloc(buflen); if (buf == NULL) { *errnop = ENOMEM; @@ -95,12 +95,22 @@ check_nonlocal_uid(const char *user, uid_t uid, int *errnop) nip = startp; fct.ptr = fct_start; do { + morebuf: if (fct.l == _nss_nonlocal_getpwuid_r) status = NSS_STATUS_NOTFOUND; else status = DL_CALL_FCT(fct.l, (uid, &pwbuf, 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) { @@ -130,7 +140,7 @@ check_nonlocal_user(const char *user, int *errnop) struct passwd pwbuf; int old_errno = errno; - int buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); char *buf = malloc(buflen); if (buf == NULL) { *errnop = ENOMEM; @@ -146,12 +156,22 @@ check_nonlocal_user(const char *user, int *errnop) nip = startp; fct.ptr = fct_start; do { + morebuf: if (fct.l == _nss_nonlocal_getpwnam_r) status = NSS_STATUS_NOTFOUND; else status = DL_CALL_FCT(fct.l, (user, &pwbuf, 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)