From 0f39ff74a85e16cbfd30354e24403b1ee50e1104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tatuya=20JINMEI=20=E7=A5=9E=E6=98=8E=E9=81=94=E5=93=89?= Date: Tue, 17 Jun 2008 22:35:08 +0000 Subject: [PATCH] 2383. [bug] named could double queries when they resulted in SERVFAIL due to overkilling EDNS0 failure detection. --- CHANGES | 3 +++ lib/dns/resolver.c | 13 +++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 0bdfc5ef69..51d3b52a71 100644 --- 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. diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index a2c40295db..599d6b98d7 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -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