The dns_zone_catz_enable_db() and dns_zone_catz_disable_db()
functions can race with similar operations in the catz module
because there is no synchronization between the threads.
Add catz functions which use the view's catalog zones' lock
when registering/unregistering the database update notify callback,
and use those functions in the dns_zone module, instead of doing it
directly.
(cherry picked from commit
6f1f5fc307c2513d31cda94ef8cc47aa5efeaf88)
return (result);
}
+void
+dns_catz_dbupdate_unregister(dns_db_t *db, dns_catz_zones_t *catzs) {
+ REQUIRE(DNS_DB_VALID(db));
+ REQUIRE(DNS_CATZ_ZONES_VALID(catzs));
+
+ LOCK(&catzs->lock);
+ dns_db_updatenotify_unregister(db, dns_catz_dbupdate_callback, catzs);
+ UNLOCK(&catzs->lock);
+}
+
+void
+dns_catz_dbupdate_register(dns_db_t *db, dns_catz_zones_t *catzs) {
+ REQUIRE(DNS_DB_VALID(db));
+ REQUIRE(DNS_CATZ_ZONES_VALID(catzs));
+
+ LOCK(&catzs->lock);
+ dns_db_updatenotify_register(db, dns_catz_dbupdate_callback, catzs);
+ UNLOCK(&catzs->lock);
+}
+
static bool
catz_rdatatype_is_processable(const dns_rdatatype_t type) {
return (!dns_rdatatype_isdnssec(type) && type != dns_rdatatype_cds &&
* \li 'fn_arg' is not NULL (casted to dns_catz_zones_t*).
*/
+void
+dns_catz_dbupdate_unregister(dns_db_t *db, dns_catz_zones_t *catzs);
+/*%<
+ * Register the catalog zone database update notify callback.
+ *
+ * Requires:
+ * \li 'db' is a valid database.
+ * \li 'catzs' is valid.
+ */
+
+void
+dns_catz_dbupdate_register(dns_db_t *db, dns_catz_zones_t *catzs);
+/*%<
+ * Unregister the catalog zone database update notify callback.
+ *
+ * Requires:
+ * \li 'db' is a valid database.
+ * \li 'catzs' is valid.
+ */
+
void
dns_catz_prereconfig(dns_catz_zones_t *catzs);
/*%<
REQUIRE(db != NULL);
if (zone->catzs != NULL) {
- dns_db_updatenotify_register(db, dns_catz_dbupdate_callback,
- zone->catzs);
+ dns_catz_dbupdate_register(db, zone->catzs);
}
}
REQUIRE(db != NULL);
if (zone->catzs != NULL) {
- dns_db_updatenotify_unregister(db, dns_catz_dbupdate_callback,
- zone->catzs);
+ dns_catz_dbupdate_unregister(db, zone->catzs);
}
}