From: Witold Kręcicki Date: Thu, 3 Jan 2019 12:06:39 +0000 (+0100) Subject: When a forwarder fails and we're not in a forward-only mode we X-Git-Tag: v9.13.6~50^2 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=cfa2804e5a13aedd4fb36496f995cfdc7eb7a6c5;p=thirdparty%2Fbind9.git When a forwarder fails and we're not in a forward-only mode we go back to regular resolution. When this happens the fetch timer is already running, and we might end up in a situation where we we create a fetch for qname-minimized query and after that the timer is triggered and the query is retried (fctx_try) - which causes relaunching of qname-minimization fetch - and since we already have a qmin fetch for this fctx - assertion failure. This fix stops the timer when doing qname minimization - qmin fetch internal timer should take care of all the possible timeouts. --- diff --git a/CHANGES b/CHANGES index c3be4bc5b18..201b7f2c248 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +5138. [bug] Under some circumstances named could hit an assertion + failure when doing qname minimization when using + forwarders. [GL #797] + 5137. [func] named now logs messages whenever a mirror zone becomes usable or unusable for resolution purposes. [GL #818] diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index da9083010e5..1d63e86ec00 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -4040,9 +4040,11 @@ fctx_try(fetchctx_t *fctx, bool retrying, bool badcache) { options &= ~DNS_FETCHOPT_QMINIMIZE; fctx_increference(fctx); task = res->buckets[bucketnum].task; + fctx_stoptimer(fctx); result = dns_resolver_createfetch(fctx->res, &fctx->qminname, fctx->qmintype, &fctx->domain, - &fctx->nameservers, NULL, NULL, 0, + &fctx->nameservers, + NULL, NULL, 0, options, 0, fctx->qc, task, resume_qmin, fctx, &fctx->qminrrset, NULL, @@ -4371,13 +4373,12 @@ fctx_timeout(isc_task_t *task, isc_event_t *event) { * timer. */ result = fctx_starttimer(fctx); - if (result != ISC_R_SUCCESS) + if (result != ISC_R_SUCCESS) { fctx_done(fctx, result, __LINE__); - else - /* - * Keep trying. - */ + } else { + /* Keep trying */ fctx_try(fctx, true, false); + } } isc_event_free(&event);