From ed268b46f11706bde3da68bd2a4b45752350f736 Mon Sep 17 00:00:00 2001 From: Aram Sargsyan Date: Thu, 26 Jan 2023 19:08:19 +0000 Subject: [PATCH] Process db callbacks in zone_loaddone() after zone_postload() The zone_postload() function can fail and unregister the callbacks. Call dns_db_endload() only after calling zone_postload() to make sure that the registered update-notify callbacks are not called when the zone loading has failed during zone_postload(). Also, don't ignore the return value of zone_postload(). --- lib/dns/zone.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 3668c4c437..4e2d746718 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -17225,13 +17225,6 @@ zone_loaddone(void *arg, isc_result_t result) { dns_zone_catz_disable_db(zone, load->db); } - tresult = dns_db_endload(load->db, &load->callbacks); - if (tresult != ISC_R_SUCCESS && - (result == ISC_R_SUCCESS || result == DNS_R_SEENINCLUDE)) - { - result = tresult; - } - /* * Lock hierarchy: zmgr, zone, raw. */ @@ -17250,9 +17243,13 @@ again: goto again; } } - (void)zone_postload(zone, load->db, load->loadtime, result); + tresult = zone_postload(zone, load->db, load->loadtime, result); + if (tresult != ISC_R_SUCCESS && + (result == ISC_R_SUCCESS || result == DNS_R_SEENINCLUDE)) + { + result = tresult; + } DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_LOADING); - zone_idetach(&load->callbacks.zone); /* * Leave the zone frozen if the reload fails. */ @@ -17269,6 +17266,12 @@ again: } UNLOCK_ZONE(zone); + (void)dns_db_endload(load->db, &load->callbacks); + + LOCK_ZONE(zone); + zone_idetach(&load->callbacks.zone); + UNLOCK_ZONE(zone); + dns_db_detach(&load->db); if (zone->loadctx != NULL) { dns_loadctx_detach(&zone->loadctx);