summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2012-03-28 10:09:29 -0600
committerJeff Law <law@redhat.com>2012-03-28 10:09:29 -0600
commit86ae07a8c9e8e26806f7b8dedf57e7b14a308c69 (patch)
tree6db3d9b928db3a345d47c3e52ca49519d474ea81
parentd6270972f79fe89a96fa7a3909991dad2e317033 (diff)
downloadglibc-86ae07a8c9e8e26806f7b8dedf57e7b14a308c69.tar.gz
[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.
-rw-r--r--ChangeLog7
-rw-r--r--NEWS6
-rw-r--r--resolv/nss_dns/dns-host.c8
3 files changed, 17 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index f75e1211bb..ba7b2cd06c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-02-22 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ [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.
+
2012-03-28 Joseph Myers <joseph@codesourcery.com>
[BZ #369]
diff --git a/NEWS b/NEWS
index 3ebc0ffff2..ec8ecdb45d 100644
--- a/NEWS
+++ b/NEWS
@@ -16,9 +16,9 @@ Version 2.16
11494, 12047, 13058, 13525, 13526, 13527, 13528, 13529, 13530, 13531,
13532, 13533, 13547, 13551, 13552, 13553, 13555, 13559, 13566, 13583,
13618, 13637, 13656, 13658, 13673, 13695, 13704, 13706, 13726, 13738,
- 13786, 13792, 13806, 13824, 13840, 13841, 13844, 13846, 13851, 13852,
- 13854, 13871, 13879, 13883, 13892, 13910, 13911, 13912, 13913, 13915,
- 13916, 13917, 13918, 13919, 13920, 13921
+ 13760, 13786, 13792, 13806, 13824, 13840, 13841, 13844, 13846, 13851,
+ 13852, 13854, 13871, 13879, 13883, 13892, 13910, 13911, 13912, 13913,
+ 13915, 13916, 13917, 13918, 13919, 13920, 13921
* ISO C11 support:
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,