Don't ignore auth zones when in serve-stale mode

When serve-stale is enabled and recursive resolution fails, the fallback
to lookup stale data always happens in the cache database. Any
authoritative data is ignored, and only information learned through
recursive resolution is examined.

If there is data in the cache that could lead to an answer, and this can
be just the root delegation, the resolver will iterate further, getting
closer to the answer that can be found by recursing down the root, and
eventually puts the final response in the cache.

Change the fallback to serve-stale to use 'query_getdb()', that finds
out the best matching database for the given query.

(cherry picked from commit 2322425016)
This commit is contained in:
Matthijs Mekking
2023-10-30 19:33:19 +01:00
parent 784b096098
commit 76c9019403

View File

@@ -7681,8 +7681,19 @@ query_usestale(query_ctx_t *qctx, isc_result_t result) {
qctx_freedata(qctx);
if (dns_view_staleanswerenabled(qctx->client->view)) {
dns_db_attach(qctx->client->view->cachedb, &qctx->db);
qctx->version = NULL;
isc_result_t ret;
ret = query_getdb(qctx->client, qctx->client->query.qname,
qctx->client->query.qtype, qctx->options,
&qctx->zone, &qctx->db, &qctx->version,
&qctx->is_zone);
if (ret != ISC_R_SUCCESS) {
/*
* Failed to get the database, unexpected, but let us
* at least abandon serve-stale.
*/
return (false);
}
qctx->client->query.dboptions |= DNS_DBFIND_STALEOK;
if (qctx->client->query.fetch != NULL) {
dns_resolver_destroyfetch(&qctx->client->query.fetch);