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
This commit is contained in:
parent
28b1a3eac2
commit
e36c6e48fb
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue