]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix a data race between the dns_zone and dns_catz modules
authorAram Sargsyan <aram@isc.org>
Fri, 9 Jun 2023 07:13:27 +0000 (07:13 +0000)
committerAram Sargsyan <aram@isc.org>
Thu, 6 Jul 2023 10:44:03 +0000 (10:44 +0000)
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)

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

index 37ba7f0fb416e6fe82017ae1754d1c46d3733041..70b48fdc2c5dde8d9f4b229be3c4a18587a7763c 100644 (file)
@@ -2222,6 +2222,26 @@ cleanup:
        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 &&
index 2454ed4f663dde9415d30cf91b269f0687dd0fed..1401380ee95f045052871db4089e6c4f5fc92662 100644 (file)
@@ -358,6 +358,26 @@ dns_catz_dbupdate_callback(dns_db_t *db, void *fn_arg);
  * \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);
 /*%<
index b9e9791d4f2bff7594de9aece1a965577571c7ec..52122ad8d17fc573411b120dcbec73284ccc0b48 100644 (file)
@@ -1972,8 +1972,7 @@ dns_zone_catz_enable_db(dns_zone_t *zone, dns_db_t *db) {
        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);
        }
 }
 
@@ -1983,8 +1982,7 @@ dns_zone_catz_disable_db(dns_zone_t *zone, dns_db_t *db) {
        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);
        }
 }