diff --git a/lib/dns/catz.c b/lib/dns/catz.c index 487d20833e..332f987736 100644 --- a/lib/dns/catz.c +++ b/lib/dns/catz.c @@ -810,9 +810,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 c5de3d9e0b..04cf6560fe 100644 --- a/lib/dns/db.c +++ b/lib/dns/db.c @@ -1013,7 +1013,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 @@ -1024,6 +1024,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 f14d9f6c52..08bdc80e4e 100644 --- a/lib/dns/include/dns/db.h +++ b/lib/dns/include/dns/db.h @@ -1673,11 +1673,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 * */