From e36c6e48fbfe785629c515c070d90fb63c8ca4de Mon Sep 17 00:00:00 2001 From: Maarten de Vries Date: Thu, 16 Feb 2017 10:52:04 +0100 Subject: nss-resolve: report ERANGE for small buffers. (#5359) The correct error code to report when a provided buffer is too small is ERANGE. This is recognized by glibc, which will then try again with a larger buffer. The old behaviour of reporting ENOMEM has no special meaning for glibc. The error will simply be propagated to the application, and a later retry will trigger the same error again. Additionally, h_errnop must be set to NETDB_INTERNAL to have glibc look at errnop for details. More information at: https://www.gnu.org/software/libc/manual/html_node/NSS-Modules-Interface.html --- src/nss-resolve/nss-resolve.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/nss-resolve/nss-resolve.c') diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c index ce8d59d390..440dd4b78a 100644 --- a/src/nss-resolve/nss-resolve.c +++ b/src/nss-resolve/nss-resolve.c @@ -206,8 +206,8 @@ enum nss_status _nss_resolve_gethostbyname4_r( l = strlen(canonical); ms = ALIGN(l+1) + ALIGN(sizeof(struct gaih_addrtuple)) * c; if (buflen < ms) { - *errnop = ENOMEM; - *h_errnop = TRY_AGAIN; + *errnop = ERANGE; + *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } @@ -394,8 +394,8 @@ enum nss_status _nss_resolve_gethostbyname3_r( ms = ALIGN(l+1) + c * ALIGN(alen) + (c+2) * sizeof(char*); if (buflen < ms) { - *errnop = ENOMEM; - *h_errnop = TRY_AGAIN; + *errnop = ERANGE; + *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } @@ -615,8 +615,8 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( c * sizeof(char*); /* pointers to aliases, plus trailing NULL */ if (buflen < ms) { - *errnop = ENOMEM; - *h_errnop = TRY_AGAIN; + *errnop = ERANGE; + *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } -- cgit v1.2.1