From 86ae07a8c9e8e26806f7b8dedf57e7b14a308c69 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 28 Mar 2012 10:09:29 -0600 Subject: [BZ #13760] * resolv/nss_dns/dns-host.c (gaih_getanswer): Look for errno in the right place. Discard and retry query if response is larger than input buffer size. --- resolv/nss_dns/dns-host.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'resolv') diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 01369f6076..10aecb8604 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -1219,7 +1219,13 @@ gaih_getanswer (const querybuf *answer1, int anslen1, const querybuf *answer2, &first); if ((status == NSS_STATUS_SUCCESS || status == NSS_STATUS_NOTFOUND || (status == NSS_STATUS_TRYAGAIN - && (errno != ERANGE || *h_errnop != NO_RECOVERY))) + /* We want to look at the second answer in case of an + NSS_STATUS_TRYAGAIN only if the error is non-recoverable, i.e. + *h_errnop is NO_RECOVERY. If not, and if the failure was due to + an insufficient buffer (ERANGE), then we need to drop the results + and pass on the NSS_STATUS_TRYAGAIN to the caller so that it can + repeat the query with a larger buffer. */ + && (*errnop != ERANGE || *h_errnop == NO_RECOVERY))) && answer2 != NULL && anslen2 > 0) { enum nss_status status2 = gaih_getanswer_slice(answer2, anslen2, qname, -- cgit 1.4.1