summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaarten de Vries <maarten@de-vri.es>2017-02-16 10:52:04 +0100
committerLennart Poettering <lennart@poettering.net>2017-02-16 10:52:04 +0100
commite36c6e48fbfe785629c515c070d90fb63c8ca4de (patch)
tree97d36752ff875561050f566444eb5229e715a6b2 /src
parent28b1a3eac252d471de4fbb6f317353af30d68878 (diff)
downloadsystemd-e36c6e48fbfe785629c515c070d90fb63c8ca4de.tar.gz
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
Diffstat (limited to 'src')
-rw-r--r--src/nss-resolve/nss-resolve.c12
1 files changed, 6 insertions, 6 deletions
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;
}