2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 14:07:59 +00:00

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.
This commit is contained in:
Witold Kręcicki
2019-01-03 13:06:39 +01:00
committed by Evan Hunt
parent bbb0947ee1
commit cfa2804e5a
2 changed files with 11 additions and 6 deletions

View File

@@ -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 5137. [func] named now logs messages whenever a mirror zone becomes
usable or unusable for resolution purposes. [GL #818] usable or unusable for resolution purposes. [GL #818]

View File

@@ -4040,9 +4040,11 @@ fctx_try(fetchctx_t *fctx, bool retrying, bool badcache) {
options &= ~DNS_FETCHOPT_QMINIMIZE; options &= ~DNS_FETCHOPT_QMINIMIZE;
fctx_increference(fctx); fctx_increference(fctx);
task = res->buckets[bucketnum].task; task = res->buckets[bucketnum].task;
fctx_stoptimer(fctx);
result = dns_resolver_createfetch(fctx->res, &fctx->qminname, result = dns_resolver_createfetch(fctx->res, &fctx->qminname,
fctx->qmintype, &fctx->domain, fctx->qmintype, &fctx->domain,
&fctx->nameservers, NULL, NULL, 0, &fctx->nameservers,
NULL, NULL, 0,
options, 0, fctx->qc, task, options, 0, fctx->qc, task,
resume_qmin, fctx, resume_qmin, fctx,
&fctx->qminrrset, NULL, &fctx->qminrrset, NULL,
@@ -4371,13 +4373,12 @@ fctx_timeout(isc_task_t *task, isc_event_t *event) {
* timer. * timer.
*/ */
result = fctx_starttimer(fctx); result = fctx_starttimer(fctx);
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS) {
fctx_done(fctx, result, __LINE__); fctx_done(fctx, result, __LINE__);
else } else {
/* /* Keep trying */
* Keep trying.
*/
fctx_try(fctx, true, false); fctx_try(fctx, true, false);
}
} }
isc_event_free(&event); isc_event_free(&event);