mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-30 14:07:59 +00:00
Fix a data race between the dns_zone and dns_catz modules
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.
This commit is contained in:
@@ -2191,6 +2191,26 @@ cleanup:
|
|||||||
return (result);
|
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
|
static bool
|
||||||
catz_rdatatype_is_processable(const dns_rdatatype_t type) {
|
catz_rdatatype_is_processable(const dns_rdatatype_t type) {
|
||||||
return (!dns_rdatatype_isdnssec(type) && type != dns_rdatatype_cds &&
|
return (!dns_rdatatype_isdnssec(type) && type != dns_rdatatype_cds &&
|
||||||
|
@@ -354,6 +354,26 @@ dns_catz_dbupdate_callback(dns_db_t *db, void *fn_arg);
|
|||||||
* \li 'fn_arg' is not NULL (casted to dns_catz_zones_t*).
|
* \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
|
void
|
||||||
dns_catz_prereconfig(dns_catz_zones_t *catzs);
|
dns_catz_prereconfig(dns_catz_zones_t *catzs);
|
||||||
/*%<
|
/*%<
|
||||||
|
@@ -1939,8 +1939,7 @@ dns_zone_catz_enable_db(dns_zone_t *zone, dns_db_t *db) {
|
|||||||
REQUIRE(db != NULL);
|
REQUIRE(db != NULL);
|
||||||
|
|
||||||
if (zone->catzs != NULL) {
|
if (zone->catzs != NULL) {
|
||||||
dns_db_updatenotify_register(db, dns_catz_dbupdate_callback,
|
dns_catz_dbupdate_register(db, zone->catzs);
|
||||||
zone->catzs);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1950,8 +1949,7 @@ dns_zone_catz_disable_db(dns_zone_t *zone, dns_db_t *db) {
|
|||||||
REQUIRE(db != NULL);
|
REQUIRE(db != NULL);
|
||||||
|
|
||||||
if (zone->catzs != NULL) {
|
if (zone->catzs != NULL) {
|
||||||
dns_db_updatenotify_unregister(db, dns_catz_dbupdate_callback,
|
dns_catz_dbupdate_unregister(db, zone->catzs);
|
||||||
zone->catzs);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user