From 7b46d898b6b63b51b14dcc53225c2ee6e9f2cf31 Mon Sep 17 00:00:00 2001 From: Aram Sargsyan Date: Wed, 21 May 2025 14:44:50 +0000 Subject: [PATCH] Fix a zone refresh bug in zone.c:refresh_callback() 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. (cherry picked from commit 228e441328af8f3a54c1ae3f0cd7b871dab83609) --- lib/dns/zone.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index d539d4695b..bf0ba0ecad 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -14308,6 +14308,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;