]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix a zone refresh bug in zone.c:refresh_callback()
authorAram Sargsyan <aram@isc.org>
Wed, 21 May 2025 14:44:50 +0000 (14:44 +0000)
committerOndřej Surý <ondrej@isc.org>
Wed, 28 May 2025 16:20:13 +0000 (16:20 +0000)
When the zone.c:refresh_callback() callback function is called during
a SOA request before a zone transfer, it can receive a
ISC_R_SHUTTINGDOWN result for the sent request when named is shutting
down, and in that case it just destroys the request and finishes the
ongoing transfer, without clearing the DNS_ZONEFLG_REFRESH flag of the
zone. This is alright when named is going to shutdown, but currently
the callback can get a ISC_R_SHUTTINGDOWN result also when named is
reconfigured during the ongoibg SOA request. In that case, leaving the
DNS_ZONEFLG_REFRESH flag set results in the zone never being able
to refresh again, because any new attempts will be caneled while
the flag is set. Clear the DNS_ZONEFLG_REFRESH flag on the 'exiting'
error path of the callback function.

lib/dns/zone.c

index 79738fe595c36dcd0db2340de1241480b047e6dd..bffd7f4673ca0f2cb64014a10736de77de5e55ab 100644 (file)
@@ -14283,6 +14283,17 @@ next_primary:
        goto detach;
 
 exiting:
+       /*
+        * We can get here not only during shutdown, but also when the refresh
+        * is canceled during reconfiguration. In that case, make sure to clear
+        * the DNS_ZONEFLG_REFRESH flag so that future zone refreshes don't get
+        * stuck, and make sure a new refresh attempt is made again soon after
+        * the reconfiguration is complete.
+        */
+       DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH);
+       zone->refreshtime = now;
+       zone_settimer(zone, &now);
+
        dns_request_destroy(&zone->request);
        goto detach;