From: Colin Vidal Date: Wed, 18 Feb 2026 15:05:19 +0000 (+0100) Subject: Use delegdb for lookup in query_delegation_recurse() X-Git-Tag: v9.21.21~4^2~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=883478bc6a8650ec7b2608ffaf1dd30b9f7e95c6;p=thirdparty%2Fbind9.git Use delegdb for lookup in query_delegation_recurse() When `query.c` finds a zonecut in the main cache (e.g. from stale NS records), it must still use the correct delegation for recursion. Look up the delegation DB via `dns_view_bestzonecut()` first; fall back to `dns_deleg_fromrdataset()` only if no delegation is found. This might also be done inside `query_lookup()` instead, with the `qctx` holding a delegset property, but that approach needs further work to avoid breakage and it is not clear so far if there would be other use case of it. Current approach is simpler for now. --- diff --git a/lib/ns/query.c b/lib/ns/query.c index 790db19b532..b25b37c91f6 100644 --- a/lib/ns/query.c +++ b/lib/ns/query.c @@ -8658,11 +8658,21 @@ query_delegation_recurse(query_ctx_t *qctx) { * Any other recursion. */ dns_delegset_t *delegset = NULL; + dns_fixedname_t ffname; + dns_name_t *fname = dns_fixedname_initname(&ffname); + isc_result_t tresult; + + tresult = dns_view_bestzonecut(qctx->view, qname, fname, NULL, + qctx->client->inner.now, 0, true, + true, &delegset); + if (tresult != ISC_R_SUCCESS) { + dns_delegset_fromrdataset(qctx->rdataset, &delegset); + fname = qctx->fname; + } - dns_deleg_fromrdataset(qctx->rdataset, &delegset); result = ns_query_recurse(qctx->client, qctx->qtype, qname, - qctx->fname, delegset, - qctx->resuming); + fname, delegset, qctx->resuming); + if (delegset != NULL) { dns_delegset_detach(&delegset); }