From 90822519ebbb0b2b6974c15517961ed143ece915 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 30 Nov 2022 18:40:27 +1100 Subject: [PATCH] Suppress duplicate dns_db_updatenotify_register registrations Duplicate dns_db_updatenotify_register registrations need to be suppressed to ensure that dns_db_updatenotify_unregister is successful. (cherry picked from commit f13e71e55167bf9c94f4faf1dab110467158e7b4) --- lib/dns/catz.c | 6 +++--- lib/dns/db.c | 12 +++++++++++- lib/dns/include/dns/db.h | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/dns/catz.c b/lib/dns/catz.c index 7523eea5db..908e7e5c39 100644 --- a/lib/dns/catz.c +++ b/lib/dns/catz.c @@ -981,9 +981,9 @@ dns_catz_zone_detach(dns_catz_zone_t **zonep) { zone->magic = 0; isc_timer_detach(&zone->updatetimer); 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); diff --git a/lib/dns/db.c b/lib/dns/db.c index 0b19b2a8f0..22b8975707 100644 --- a/lib/dns/db.c +++ b/lib/dns/db.c @@ -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; diff --git a/lib/dns/include/dns/db.h b/lib/dns/include/dns/db.h index 2fa4cfd2af..7ea69f77db 100644 --- a/lib/dns/include/dns/db.h +++ b/lib/dns/include/dns/db.h @@ -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 * */