char buf[DNS_NAME_FORMATSIZE];
dns_rbt_t **treep;
isc_time_t start;
- dns_dbonupdatelistener_t *listener, *listener_next;
if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in) {
overmem((dns_db_t *)rbtdb, (bool)-1);
rbtdb->common.impmagic = 0;
isc_mem_detach(&rbtdb->hmctx);
- for (listener = ISC_LIST_HEAD(rbtdb->common.update_listeners);
- listener != NULL; listener = listener_next)
- {
- listener_next = ISC_LIST_NEXT(listener, link);
- ISC_LIST_UNLINK(rbtdb->common.update_listeners, listener, link);
- isc_mem_put(rbtdb->common.mctx, listener,
- sizeof(dns_dbonupdatelistener_t));
- }
+ INSIST(ISC_LIST_EMPTY(rbtdb->common.update_listeners));
isc_mem_putanddetach(&rbtdb->common.mctx, rbtdb, sizeof(*rbtdb));
}
zone->rpzs->zones[zone->rpz_num]);
}
+/*
+ * If a zone is a catalog zone, attach it to update notification in database.
+ */
+void
+dns_zone_catz_enable_db(dns_zone_t *zone, dns_db_t *db) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+ REQUIRE(db != NULL);
+
+ if (zone->catzs != NULL) {
+ dns_db_updatenotify_register(db, dns_catz_dbupdate_callback,
+ zone->catzs);
+ }
+}
+
+static void
+dns_zone_catz_disable_db(dns_zone_t *zone, dns_db_t *db) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+ REQUIRE(db != NULL);
+
+ if (zone->catzs != NULL) {
+ dns_db_updatenotify_unregister(db, dns_catz_dbupdate_callback,
+ zone->catzs);
+ }
+}
+
static void
zone_catz_enable(dns_zone_t *zone, dns_catz_zones_t *catzs) {
REQUIRE(DNS_ZONE_VALID(zone));
REQUIRE(DNS_ZONE_VALID(zone));
if (zone->catzs != NULL) {
+ if (zone->db != NULL) {
+ dns_zone_catz_disable_db(zone, zone->db);
+ }
dns_catz_catzs_detach(&zone->catzs);
}
}
return (zone->catzs != NULL);
}
-/*
- * If a zone is a catalog zone, attach it to update notification in database.
- */
-void
-dns_zone_catz_enable_db(dns_zone_t *zone, dns_db_t *db) {
- REQUIRE(DNS_ZONE_VALID(zone));
- REQUIRE(db != NULL);
-
- if (zone->catzs != NULL) {
- dns_db_updatenotify_register(db, dns_catz_dbupdate_callback,
- zone->catzs);
- }
-}
-
-static void
-dns_zone_catz_disable_db(dns_zone_t *zone, dns_db_t *db) {
- REQUIRE(DNS_ZONE_VALID(zone));
- REQUIRE(db != NULL);
-
- if (zone->catzs != NULL) {
- dns_db_updatenotify_unregister(db, dns_catz_dbupdate_callback,
- zone->catzs);
- }
-}
-
/*
* Set catalog zone ownership of the zone
*/
isc_result_totext(result));
}
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_rpz_disable_db(zone, db);
+ dns_zone_catz_disable_db(zone, db);
+ }
+
for (inc = ISC_LIST_HEAD(zone->newincludes); inc != NULL;
inc = ISC_LIST_HEAD(zone->newincludes))
{
zone_detachdb(dns_zone_t *zone) {
REQUIRE(zone->db != NULL);
+ dns_zone_rpz_disable_db(zone, zone->db);
+ dns_zone_catz_disable_db(zone, zone->db);
dns_db_detach(&zone->db);
}