]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
[BZ #13760]
authorJeff Law <law@redhat.com>
Wed, 28 Mar 2012 16:09:29 +0000 (10:09 -0600)
committerJeff Law <law@redhat.com>
Wed, 28 Mar 2012 16:09:29 +0000 (10:09 -0600)
        * 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.

ChangeLog
NEWS
resolv/nss_dns/dns-host.c

index f75e1211bbb4341788638b2d3807e4ca5c43f1de..ba7b2cd06c32905b7c0a2b01ac142b03a66a1ccf 100644 (file)
--- 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 3ebc0ffff2793b5b78342cb7492ac83c9caa7446..ec8ecdb45d03a9b0d9e01709a479c7d43f7813a4 100644 (file)
--- 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:
 
index 01369f607682bacc357181e74e9e853ea31b4414..10aecb8604c47eec9803963b4605800a3531078c 100644 (file)
@@ -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,