]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2383. [bug] named could double queries when they resulted in
authorTatuya JINMEI 神明達哉 <jinmei@isc.org>
Tue, 17 Jun 2008 22:35:08 +0000 (22:35 +0000)
committerTatuya JINMEI 神明達哉 <jinmei@isc.org>
Tue, 17 Jun 2008 22:35:08 +0000 (22:35 +0000)
SERVFAIL due to overkilling EDNS0 failure detection.

CHANGES
lib/dns/resolver.c

diff --git a/CHANGES b/CHANGES
index 0bdfc5ef6952dcf9e2786a82b7075c67b4137c78..51d3b52a717bfd4f94de6ef590535e726aa20b5b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2383.  [bug]           named could double queries when they resulted in
+                       SERVFAIL due to overkilling EDNS0 failure detection.
+
 2382.  [doc]           Add descriptions of DHCID, IPSECKEY, SPF and SSHFP
                        to ARM.
 
index a2c40295db05e0298e9f93e49c61b356a174afc4..599d6b98d7691a92188a2a9a743bf7961384a890 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: resolver.c,v 1.371 2008/05/29 04:46:32 marka Exp $ */
+/* $Id: resolver.c,v 1.372 2008/06/17 22:35:08 jinmei Exp $ */
 
 /*! \file */
 
@@ -5843,12 +5843,17 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
         */
        if (message->rcode != dns_rcode_noerror &&
            message->rcode != dns_rcode_nxdomain) {
-               if ((message->rcode == dns_rcode_formerr ||
-                    message->rcode == dns_rcode_notimp ||
-                    message->rcode == dns_rcode_servfail) &&
+               if (((message->rcode == dns_rcode_formerr ||
+                    message->rcode == dns_rcode_notimp) ||
+                   (message->rcode == dns_rcode_servfail &&
+                    dns_message_getopt(message) == NULL)) &&
                    (query->options & DNS_FETCHOPT_NOEDNS0) == 0) {
                        /*
                         * It's very likely they don't like EDNS0.
+                        * If the response code is SERVFAIL, also check if the
+                        * response contains an OPT RR and don't cache the
+                        * failure since it can be returned for various other
+                        * reasons.
                         *
                         * XXXRTH  We should check if the question
                         *              we're asking requires EDNS0, and