about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2012-03-28 13:06:05 -0400
committerUlrich Drepper <drepper@gmail.com>2012-03-28 13:06:05 -0400
commitfb289bde9a171c5f7fbcd1230018562dc0bd8ded (patch)
tree1241c18540bd856de5a57808329b64e03d490f7c
parent05f3d1f6c6ae403180259b84a5af0061a62ffb98 (diff)
parent86ae07a8c9e8e26806f7b8dedf57e7b14a308c69 (diff)
downloadglibc-fb289bde9a171c5f7fbcd1230018562dc0bd8ded.tar.gz
glibc-fb289bde9a171c5f7fbcd1230018562dc0bd8ded.tar.xz
glibc-fb289bde9a171c5f7fbcd1230018562dc0bd8ded.zip
Merge branch 'master' of ssh://sourceware.org/git/glibc
Conflicts:
	ChangeLog
-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 94d51265e9..03b77954b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,13 @@
 
 	* malloc/mallocbug.c: Avoid warnings about unused variables.
 
+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,