From: Witold Kręcicki Date: Tue, 22 May 2018 07:58:24 +0000 (+0200) Subject: Disable qname minimization if we encounter a bad server X-Git-Tag: v9.13.2~42^2~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c04784c144850a7deb4a510b2df78e5a5a1de4dc;p=thirdparty%2Fbind9.git Disable qname minimization if we encounter a bad server --- diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index f8b8e395054..d311ff33e19 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -65,7 +65,7 @@ #include #include #include - +#define WANT_QUERYTRACE #ifdef WANT_QUERYTRACE #define RTRACE(m) isc_log_write(dns_lctx, \ DNS_LOGCATEGORY_RESOLVER, \ @@ -8507,10 +8507,6 @@ rctx_answer_none(respctx_t *rctx) { * If we're minimizing in relaxed mode, retry with full name, * just to be safe. The error will be logged. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER, - DNS_LOGMODULE_RESOLVER, ISC_LOG_INFO, - "XXX %d %d", fctx->minimized, - fctx->options & DNS_FETCHOPT_QMIN_STRICT); if (fctx->minimized && (fctx->options & DNS_FETCHOPT_QMIN_STRICT) == 0) { isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER, @@ -8553,7 +8549,7 @@ rctx_answer_none(respctx_t *rctx) { * NXDOMAIN we go straight to the full query. */ if (fctx->minimized && !(fctx->options & DNS_FETCHOPT_QMIN_STRICT)) { - fctx->qmin_labels = DNS_MAX_LABELS+1; + fctx->qmin_labels = DNS_MAX_LABELS + 1; return rctx_answer_minimized(rctx); } /* @@ -9398,15 +9394,27 @@ rctx_badserver(respctx_t *rctx, isc_result_t result) { } /* - * Some servers do not ignore unknown EDNS options. + * If we're minimizing in relaxed mode try to disable minimization. */ - if (!NOCOOKIE(query->addrinfo) && + if (fctx->minimized && + (fctx->options & DNS_FETCHOPT_QMIN_STRICT) == 0) + { + isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER, + DNS_LOGMODULE_RESOLVER, ISC_LOG_INFO, + "disabling qname minimization for '%s'" + " due to bad server", fctx->info); + fctx->qmin_labels = DNS_MAX_LABELS + 1; + result = rctx_answer_minimized(rctx); + } else if (!NOCOOKIE(query->addrinfo) && (fctx->rmessage->rcode == dns_rcode_formerr || fctx->rmessage->rcode == dns_rcode_notimp || fctx->rmessage->rcode == dns_rcode_refused) && dns_adb_getcookie(fctx->adb, query->addrinfo, cookie, sizeof(cookie)) == 0U) { + /* + * Some servers do not ignore unknown EDNS options. + */ dns_adb_changeflags(fctx->adb, query->addrinfo, FCTX_ADDRINFO_NOCOOKIE, FCTX_ADDRINFO_NOCOOKIE);