From 4b919234a9b0feae20d66d9339e7b3873f57a43a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 1 Feb 1998 15:29:47 +0000 Subject: [PATCH] Correct handling of TRYAGAIN error when buffer is too small. --- nss/getXXbyYY_r.c | 19 ++++++++++++------- nss/getXXent_r.c | 19 ++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c index 13a6426dfb5..0bd79cba5ec 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -130,13 +130,18 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, while (no_more == 0) { status = (*fct) (ADD_VARIABLES, resbuf, buffer, buflen H_ERRNO_VAR); - if (status == NSS_STATUS_TRYAGAIN) - { - /* XXX This is very wrong but there is no fast soluation in sight. - Give the previous module a chance to complete it's - operation before errno will be reset by the next call */ - break; - } + + /* The the status is NSS_STATUS_TRYAGAIN and errno is ERANGE the + provided buffer is too small. In this case we should give + the user the possibility to enlarge the buffer and we should + not simply go on with the next service (even if the TRYAGAIN + action tells us so). */ + if (status == NSS_STATUS_TRYAGAIN +#ifdef NEED_H_ERRNO + && *h_errnop == NETDB_INTERNAL +#endif + && errno == ERANGE) + break; no_more = __nss_next (&nip, REENTRANT_NAME_STRING, (void **) &fct, status, 0); diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c index b43463b11d8..8dbdba85643 100644 --- a/nss/getXXent_r.c +++ b/nss/getXXent_r.c @@ -245,13 +245,18 @@ INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen, service_user *current_nip = nip; status = (*fct) (resbuf, buffer, buflen H_ERRNO_VAR); - if (status == NSS_STATUS_TRYAGAIN) - { - /* XXX This is very wrong but there is no fast solution in sight. - Give the previous module a chance to complete it's - operation before errno will be reset by the next call */ - break; - } + + /* The the status is NSS_STATUS_TRYAGAIN and errno is ERANGE the + provided buffer is too small. In this case we should give + the user the possibility to enlarge the buffer and we should + not simply go on with the next service (even if the TRYAGAIN + action tells us so). */ + if (status == NSS_STATUS_TRYAGAIN +#ifdef NEED_H_ERRNO + && *h_errnop == NETDB_INTERNAL +#endif + && errno == ERANGE) + break; no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct, status, 0); -- 2.47.2