From 03eb9aabe1df3c1202e6a7a703e1608dde6a9025 Mon Sep 17 00:00:00 2001 From: Matthijs Mekking Date: Wed, 9 Jul 2025 14:21:44 +0200 Subject: [PATCH] Special case refresh stale ncache data When refreshing stale ncache data, the qctx->rdataset is NULL and requires special processing. (cherry picked from commit 7774f16ed5b1675d3bafc479c59ff7fbf1491084) --- lib/ns/query.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/ns/query.c b/lib/ns/query.c index 5e09a9268f..f1aa109857 100644 --- a/lib/ns/query.c +++ b/lib/ns/query.c @@ -2824,12 +2824,19 @@ query_stale_refresh(ns_client_t *client, dns_name_t *qname, dns_rdataset_t *rdataset) { CTRACE(ISC_LOG_DEBUG(3), "query_stale_refresh"); - bool stale_refresh_window = - (STALE_WINDOW(rdataset) && - (client->query.dboptions & DNS_DBFIND_STALEENABLED) != 0); + bool stale_refresh_window = false; + bool stale_rrset = true; + + if (rdataset != NULL) { + stale_refresh_window = (STALE_WINDOW(rdataset) && + (client->query.dboptions & + DNS_DBFIND_STALEENABLED) != 0); + stale_rrset = STALE(rdataset); + } + if (FETCH_RECTYPE_STALE_REFRESH(client) != NULL || (client->query.dboptions & DNS_DBFIND_STALETIMEOUT) == 0 || - !STALE(rdataset) || stale_refresh_window) + !stale_rrset || stale_refresh_window) { return; } @@ -2853,6 +2860,18 @@ query_stale_refresh(ns_client_t *client, dns_name_t *qname, RECTYPE_STALE_REFRESH); } +static void +query_stale_refresh_ncache(ns_client_t *client) { + dns_name_t *qname; + + if (client->query.origqname != NULL) { + qname = client->query.origqname; + } else { + qname = client->query.qname; + } + query_stale_refresh(client, qname, NULL); +} + static void query_prefetch(ns_client_t *client, dns_name_t *qname, dns_rdataset_t *rdataset) { @@ -10344,7 +10363,7 @@ query_ncache(query_ctx_t *qctx, isc_result_t result) { } if (!qctx->is_zone && RECURSIONOK(qctx->client)) { - query_stale_refresh(qctx->client, qctx->fname, qctx->rdataset); + query_stale_refresh_ncache(qctx->client); } return query_nodata(qctx, result);