From: Mark Andrews Date: Wed, 30 Nov 2022 07:40:27 +0000 (+1100) Subject: Suppress duplicate dns_db_updatenotify_register registrations X-Git-Tag: v9.19.8~16^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f13e71e55167bf9c94f4faf1dab110467158e7b4;p=thirdparty%2Fbind9.git 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. --- diff --git a/lib/dns/catz.c b/lib/dns/catz.c index 2b8b64b5e25..bd740b1685d 100644 --- a/lib/dns/catz.c +++ b/lib/dns/catz.c @@ -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); diff --git a/lib/dns/db.c b/lib/dns/db.c index 5ea9532816c..9620efb1655 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 1831473e513..f1ca17973b9 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 * */