]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Suppress duplicate dns_db_updatenotify_register registrations
authorMark Andrews <marka@isc.org>
Wed, 30 Nov 2022 07:40:27 +0000 (18:40 +1100)
committerMark Andrews <marka@isc.org>
Tue, 6 Dec 2022 22:04:08 +0000 (09:04 +1100)
Duplicate dns_db_updatenotify_register registrations need to be
suppressed to ensure that dns_db_updatenotify_unregister is successful.

lib/dns/catz.c
lib/dns/db.c
lib/dns/include/dns/db.h

index 2b8b64b5e25a1dbe8ea2c782d769a63547d3f593..bd740b1685da18575e6c2edaa07dfd25eccc9b42 100644 (file)
@@ -982,9 +982,8 @@ dns__catz_zone_destroy(dns_catz_zone_t *zone) {
        }
 
        if (zone->db_registered) {
-               INSIST(dns_db_updatenotify_unregister(
-                              zone->db, dns_catz_dbupdate_callback,
-                              zone->catzs) == ISC_R_SUCCESS);
+               dns_db_updatenotify_unregister(
+                       zone->db, dns_catz_dbupdate_callback, zone->catzs);
        }
        if (zone->dbversion) {
                dns_db_closeversion(zone->db, &zone->dbversion, false);
index 5ea9532816c3d53b1c790303602e31d4fcfd549d..9620efb1655e20728b9fb0a8c4336e1a62da49ae 100644 (file)
@@ -995,7 +995,7 @@ dns_db_rpz_ready(dns_db_t *db) {
        return ((db->methods->rpz_ready)(db));
 }
 
-/**
+/*
  * Attach a notify-on-update function the database
  */
 isc_result_t
@@ -1006,6 +1006,16 @@ dns_db_updatenotify_register(dns_db_t *db, dns_dbupdate_callback_t fn,
        REQUIRE(db != NULL);
        REQUIRE(fn != NULL);
 
+       for (listener = ISC_LIST_HEAD(db->update_listeners); listener != NULL;
+            listener = ISC_LIST_NEXT(listener, link))
+       {
+               if ((listener->onupdate == fn) &&
+                   (listener->onupdate_arg == fn_arg))
+               {
+                       return (ISC_R_SUCCESS);
+               }
+       }
+
        listener = isc_mem_get(db->mctx, sizeof(dns_dbonupdatelistener_t));
 
        listener->onupdate = fn;
index 1831473e5139726fd6a94477e249370edd7b618f..f1ca17973b9e8832afc37a35970e311e56333f35 100644 (file)
@@ -1634,11 +1634,11 @@ dns_db_updatenotify_register(dns_db_t *db, dns_dbupdate_callback_t fn,
                             void *fn_arg);
 /*%<
  * Register a notify-on-update callback function to a database.
+ * Duplicate callbacks are suppressed.
  *
  * Requires:
  *
  * \li 'db' is a valid database
- * \li 'db' does not have an update callback registered
  * \li 'fn' is not NULL
  *
  */