diff --git a/bin/named/server.c b/bin/named/server.c index a8213215e8..1cabf96e72 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -2716,6 +2716,15 @@ configure_catz_zone(dns_view_t *view, dns_view_t *pview, } result = dns_catz_zone_add(view->catzs, &origin, &zone); + if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) { + cfg_obj_log(catz_obj, DNS_CATZ_ERROR_LEVEL, + "catz: dns_catz_zone_add failed: %s", + isc_result_totext(result)); + goto cleanup; + } + + dns_catz_zone_prereconfig(zone); + if (result == ISC_R_EXISTS) { catz_reconfig_data_t data = { .catz = zone, @@ -2734,11 +2743,6 @@ configure_catz_zone(dns_view_t *view, dns_view_t *pview, &data); result = ISC_R_SUCCESS; - } else if (result != ISC_R_SUCCESS) { - cfg_obj_log(catz_obj, DNS_CATZ_ERROR_LEVEL, - "catz: dns_catz_zone_add failed: %s", - isc_result_totext(result)); - goto cleanup; } dns_catz_zone_resetdefoptions(zone); @@ -2776,6 +2780,8 @@ configure_catz_zone(dns_view_t *view, dns_view_t *pview, opts->min_update_interval = cfg_obj_asduration(obj); } + dns_catz_zone_postreconfig(zone); + cleanup: dns_name_free(&origin, view->mctx); if (ipkl.count != 0) { diff --git a/lib/dns/catz.c b/lib/dns/catz.c index 305296b020..569f6037c0 100644 --- a/lib/dns/catz.c +++ b/lib/dns/catz.c @@ -2525,6 +2525,16 @@ dns_catz_postreconfig(dns_catz_zones_t *catzs) { isc_ht_iter_destroy(&iter); } +void +dns_catz_zone_prereconfig(dns_catz_zone_t *catz) { + LOCK(&catz->lock); +} + +void +dns_catz_zone_postreconfig(dns_catz_zone_t *catz) { + UNLOCK(&catz->lock); +} + void dns_catz_zone_for_each_entry2(dns_catz_zone_t *catz, dns_catz_entry_cb2 cb, void *arg1, void *arg2) { diff --git a/lib/dns/include/dns/catz.h b/lib/dns/include/dns/catz.h index 4f9d3b1c85..2338acadcf 100644 --- a/lib/dns/include/dns/catz.h +++ b/lib/dns/include/dns/catz.h @@ -403,6 +403,24 @@ dns_catz_zones_shutdown(dns_catz_zones_t *catzs); typedef void (*dns_catz_entry_cb2)(dns_catz_entry_t *entry, void *arg1, void *arg2); +void +dns_catz_zone_prereconfig(dns_catz_zone_t *catz); +/*%< + * Must be called before reconfiguring a catalog zone. Locks the catalog zone. + * + * Requires: + * \li 'catz' is a valid, unlocked dns_catz_zone_t. + */ + +void +dns_catz_zone_postreconfig(dns_catz_zone_t *catz); +/*%< + * Must be called after reconfiguring a catalog zone. Unlocks the catalog zone. + * + * Requires: + * \li 'catz' is a valid, locked dns_catz_zone_t. + */ + void dns_catz_zone_for_each_entry2(dns_catz_zone_t *catz, dns_catz_entry_cb2 cb, void *arg1, void *arg2);