]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Call dns_db_updatenotify_unregister earlier
authorMark Andrews <marka@isc.org>
Wed, 30 Nov 2022 07:44:37 +0000 (18:44 +1100)
committerMark Andrews <marka@isc.org>
Tue, 6 Dec 2022 22:47:37 +0000 (09:47 +1100)
dns_db_updatenotify_unregister needed to be called earlier to ensure
that listener->onupdate_arg always points to a valid object.  The
existing lazy cleanup in rbtdb_free did not ensure that.

(cherry picked from commit 35839e91d84f4c22f3554ff4b6dc53d20359621e)

lib/dns/include/dns/zone.h
lib/dns/rbtdb.c
lib/dns/zone.c

index cb5da5d046eb47425d1d5a22382fd0678d496431..4bdc936949a48a1ce9b7bee5b961e6b051684679 100644 (file)
@@ -2610,7 +2610,8 @@ dns_zone_catz_enable(dns_zone_t *zone, dns_catz_zones_t *catzs);
 void
 dns_zone_catz_disable(dns_zone_t *zone);
 /*%<
- * Disable zone as catalog zone, if it is one.
+ * Disable zone as catalog zone, if it is one.  Also disables any
+ * registered callbacks for the catalog zone.
  *
  * Requires:
  *
index 36fce510244d47b1a2dda2e661239072b5eaf374..b36cdf22059c27fc7e78e6a4edd4fdf9f8b5de63 100644 (file)
@@ -1063,7 +1063,6 @@ free_rbtdb(dns_rbtdb_t *rbtdb, bool log, isc_event_t *event) {
        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);
@@ -1220,14 +1219,7 @@ free_rbtdb(dns_rbtdb_t *rbtdb, bool log, isc_event_t *event) {
                isc_file_munmap(rbtdb->mmap_location, (size_t)rbtdb->mmap_size);
        }
 
-       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));
 }
index 62c102b374fedfe2642119ad820b200a6d012c2f..21e71767e93424942fdfef3562e3909e4d50f454 100644 (file)
@@ -1938,6 +1938,31 @@ dns_zone_rpz_disable_db(dns_zone_t *zone, dns_db_t *db) {
                                             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));
@@ -1964,6 +1989,9 @@ zone_catz_disable(dns_zone_t *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);
        }
 }
@@ -1984,31 +2012,6 @@ dns_zone_catz_is_enabled(dns_zone_t *zone) {
        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
  */
@@ -5375,6 +5378,11 @@ cleanup:
                           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))
        {
@@ -17472,6 +17480,8 @@ static void
 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);
 }