]> 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 04:20:20 +0000 (21:20 -0700)
(cherry picked from commit 488cb4da1051b3829e20ba3a47d8c11a91eccbcf)

lib/dns/resolver.c

index bd55c197d056e258da8eca51afacc4afa5a5bfcb..37e1e3e5d3ee0be5410c8cc3eb2708e161189a30 100644 (file)
@@ -4047,6 +4047,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