]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use stale data also if we are not resuming
authorMatthijs Mekking <matthijs@isc.org>
Tue, 19 Jan 2021 08:04:29 +0000 (09:04 +0100)
committerMatthijs Mekking <matthijs@isc.org>
Thu, 28 Jan 2021 15:36:46 +0000 (16:36 +0100)
Before this change, BIND will only fallback to using stale data if
there was an actual attempt to resolve the query. Then on a timeout,
the stale data from cache becomes eligible.

This commit changes this so that on any unexpected error stale data
becomes eligble (you would still have to have 'stale-answer-enable'
enabled of course).

If there is no stale data, this may return in an error again, so don't
loop on stale data lookup attempts. If the DNS_DBFIND_STALEOK flag is
set, this means we already tried to lookup stale data, so if that is
the case, don't use stale again.

lib/ns/query.c

index f413ddee19f2bd18ab50bea7b7b98eab02926311..2248e4b0b3c9101b7b0876a5300641431e082c33 100644 (file)
@@ -7441,6 +7441,14 @@ root_key_sentinel_return_servfail(query_ctx_t *qctx, isc_result_t result) {
  */
 static bool
 query_usestale(query_ctx_t *qctx) {
+       if ((qctx->client->query.dboptions & DNS_DBFIND_STALEOK) != 0) {
+               /*
+                * Query was already using stale, if that didn't work the
+                * last time, it won't work this time either.
+                */
+               return (false);
+       }
+
        qctx_clean(qctx);
        qctx_freedata(qctx);
 
@@ -7548,7 +7556,7 @@ query_gotanswer(query_ctx_t *qctx, isc_result_t res) {
                         "query_gotanswer: unexpected error: %s",
                         isc_result_totext(result));
                CCTRACE(ISC_LOG_ERROR, errmsg);
-               if (qctx->resuming && query_usestale(qctx)) {
+               if (query_usestale(qctx)) {
                        /*
                         * If serve-stale is enabled, query_usestale() already
                         * set up 'qctx' for looking up a stale response.