]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Reset DNS_{GETDB_STALEFIRST,DBFIND_STALETIMEOUT} in ns__query_start()
authorAram Sargsyan <aram@isc.org>
Thu, 26 Jun 2025 13:50:25 +0000 (13:50 +0000)
committerMichał Kępień <michal@isc.org>
Thu, 3 Jul 2025 12:24:55 +0000 (14:24 +0200)
In case of chained queries (e.g. CNAME) a discrepancy could arise
if the original query had the DNS_GETDB_STALEFIRST bit set, but
the next query doesn't have it (e.g. because the CNAME target is
a authoritative zone for the server) and cause an unanswered query
because of a logic error.

Reset both DNS_GETDB_STALEFIRST and DNS_DBFIND_STALETIMEOUT bits in
the ns__query_start() function before reevaluating whether they are
needed for the current query, and reset them again after calling
the query_lookup() function.

lib/ns/query.c

index 5a9945472798fb9d731561ea2856ec311aec9b82..e4dfab3317017edb37bb05caa3348d8270dcbff7 100644 (file)
@@ -5743,6 +5743,13 @@ ns__query_start(query_ctx_t *qctx) {
                }
        }
 
+       /*
+        * If this is a chained query (e.g. CNAME), these bits should be reset
+        * to not use the settings from the previous query.
+        */
+       qctx->options &= ~DNS_GETDB_STALEFIRST;
+       qctx->client->query.dboptions &= ~DNS_DBFIND_STALETIMEOUT;
+
        if (!qctx->is_zone && (qctx->view->staleanswerclienttimeout == 0) &&
            dns_view_staleanswerenabled(qctx->view))
        {
@@ -5762,6 +5769,7 @@ ns__query_start(query_ctx_t *qctx) {
         * when it completes, this option is not expected to be set.
         */
        qctx->options &= ~DNS_GETDB_STALEFIRST;
+       qctx->client->query.dboptions &= ~DNS_DBFIND_STALETIMEOUT;
 
 cleanup:
        return result;