]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
SERVFAIL if a prior qmin fetch has not been canceled when a new one starts
authorEvan Hunt <each@isc.org>
Fri, 27 Sep 2019 20:28:09 +0000 (13:28 -0700)
committerEvan Hunt <each@isc.org>
Wed, 2 Oct 2019 03:41:53 +0000 (20:41 -0700)
lib/dns/resolver.c

index f6937951f77996cce4fad3fc804bf27899e5f459..03f74e9033272234d4b8cb24e1af66ee4fba6849 100644 (file)
@@ -4028,6 +4028,35 @@ fctx_try(fetchctx_t *fctx, bool retrying, bool badcache) {
        if (fctx->minimized && !fctx->forwarding) {
                unsigned int options = fctx->options;
                options &= ~DNS_FETCHOPT_QMINIMIZE;
+
+               /*
+                * Is another QNAME minimization fetch still running?
+                */
+               if (fctx->qminfetch != NULL) {
+                       bool validfctx = (DNS_FETCH_VALID(fctx->qminfetch) &&
+                                         VALID_FCTX(fctx->qminfetch->private));
+                       char namebuf[DNS_NAME_FORMATSIZE];
+                       char typebuf[DNS_RDATATYPE_FORMATSIZE];
+
+                       dns_name_format(&fctx->qminname, namebuf,
+                                       sizeof(namebuf));
+                       dns_rdatatype_format(fctx->qmintype, typebuf,
+                                            sizeof(typebuf));
+
+                       isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER,
+                                     DNS_LOGMODULE_RESOLVER, ISC_LOG_ERROR,
+                                     "fctx %p(%s): attempting QNAME "
+                                     "minimization fetch for %s/%s but "
+                                     "fetch %p(%s) still running",
+                                     fctx, fctx->info, namebuf, typebuf,
+                                     fctx->qminfetch,
+                                     validfctx
+                                      ? fctx->qminfetch->private->info
+                                      : "<invalid>");
+                       fctx_done(fctx, DNS_R_SERVFAIL, __LINE__);
+                       return;
+               }
+
                /*
                 * In "_ A" mode we're asking for _.domain -
                 * resolver by default will follow delegations