]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2928. [bug] Be more selective about the non-authoritative
authorMark Andrews <marka@isc.org>
Mon, 13 Sep 2010 22:49:34 +0000 (22:49 +0000)
committerMark Andrews <marka@isc.org>
Mon, 13 Sep 2010 22:49:34 +0000 (22:49 +0000)
                        answer we apply change 2748 to. [RT #21594]

lib/dns/resolver.c

index fdf6c442edf49ff48392bfb9abfbec4053f7a889..60274a31894b5324157a8d8e0b3e65fe4a36ce3a 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: resolver.c,v 1.413.14.11 2010/07/11 00:12:18 each Exp $ */
+/* $Id: resolver.c,v 1.413.14.11.6.1 2010/09/13 22:49:34 marka Exp $ */
 
 /*! \file */
 
@@ -5628,7 +5628,7 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
                 * trying other servers.
                 */
                if (dns_name_equal(ns_name, &fctx->domain)) {
-                       log_formerr(fctx, "sideways referral");
+                       log_formerr(fctx, "non-improving referral");
                        return (DNS_R_FORMERR);
                }
 
@@ -6450,6 +6450,29 @@ iscname(fetchctx_t *fctx) {
        return (result == ISC_R_SUCCESS ? ISC_TRUE : ISC_FALSE);
 }
 
+static isc_boolean_t
+betterreferral(fetchctx_t *fctx) {
+       isc_result_t result;
+       dns_name_t *name;
+       dns_rdataset_t *rdataset;
+       dns_message_t *message = fctx->rmessage;
+
+       for (result = dns_message_firstname(message, DNS_SECTION_AUTHORITY);
+            result == ISC_R_SUCCESS;
+            result = dns_message_nextname(message, DNS_SECTION_AUTHORITY)) {
+               name = NULL;
+               dns_message_currentname(message, DNS_SECTION_AUTHORITY, &name);
+               if (!dns_name_issubdomain(name, &fctx->domain))
+                       continue;
+               for (rdataset = ISC_LIST_HEAD(name->list);
+                    rdataset != NULL;
+                    rdataset = ISC_LIST_NEXT(rdataset, link))
+                       if (rdataset->type == dns_rdatatype_ns)
+                               return (ISC_TRUE);
+       }
+       return (ISC_FALSE);
+}
+
 static void
 resquery_response(isc_task_t *task, isc_event_t *event) {
        isc_result_t result = ISC_R_SUCCESS;
@@ -6929,6 +6952,12 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
                         * it as a valid answer.
                         */
                        result = answer_response(fctx);
+               } else if (fctx->type != dns_rdatatype_ns &&
+                          !betterreferral(fctx)) {
+                       /*
+                        * Lame response !!!.
+                        */
+                       result = answer_response(fctx);
                } else {
                        if (fctx->type == dns_rdatatype_ns) {
                                /*