Fix catalog zone reconfiguration crash
The following scenario triggers a "named" crash:
1. Configure a catalog zone.
2. Start "named".
3. Comment out the "catalog-zone" clause.
4. Run `rndc reconfig`.
5. Uncomment the "catalog-zone" clause.
6. Run `rndc reconfig` again.
Implement the required cleanup of the in-memory catalog zone during
the first `rndc reconfig`, so that the second `rndc reconfig` could
find it in an expected state.
(cherry picked from commit 43ac2cd229)
This commit is contained in:
@@ -6523,6 +6523,8 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
|
||||
|
||||
if (zone_is_catz) {
|
||||
dns_zone_catz_enable(zone, view->catzs);
|
||||
} else if (dns_zone_catz_is_enabled(zone)) {
|
||||
dns_zone_catz_disable(zone);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -2605,6 +2605,26 @@ dns_zone_catz_enable(dns_zone_t *zone, dns_catz_zones_t *catzs);
|
||||
* \li prior to calling, zone->catzs is NULL or is equal to 'catzs'
|
||||
*/
|
||||
|
||||
void
|
||||
dns_zone_catz_disable(dns_zone_t *zone);
|
||||
/*%<
|
||||
* Disable zone as catalog zone, if it is one.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* \li 'zone' is a valid zone object
|
||||
*/
|
||||
|
||||
bool
|
||||
dns_zone_catz_is_enabled(dns_zone_t *zone);
|
||||
/*%<
|
||||
* Return a boolean indicating whether the zone is enabled as catalog zone.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* \li 'zone' is a valid zone object
|
||||
*/
|
||||
|
||||
void
|
||||
dns_zone_catz_enable_db(dns_zone_t *zone, dns_db_t *db);
|
||||
/*%<
|
||||
|
||||
@@ -1173,8 +1173,10 @@ dns_xfrin_shutdown
|
||||
dns_zone_addnsec3chain
|
||||
dns_zone_asyncload
|
||||
dns_zone_attach
|
||||
dns_zone_catz_disable
|
||||
dns_zone_catz_enable
|
||||
dns_zone_catz_enable_db
|
||||
dns_zone_catz_is_enabled
|
||||
dns_zone_cdscheck
|
||||
dns_zone_checknames
|
||||
dns_zone_clearforwardacl
|
||||
|
||||
@@ -1942,6 +1942,24 @@ dns_zone_catz_enable(dns_zone_t *zone, dns_catz_zones_t *catzs) {
|
||||
UNLOCK_ZONE(zone);
|
||||
}
|
||||
|
||||
void
|
||||
dns_zone_catz_disable(dns_zone_t *zone) {
|
||||
REQUIRE(DNS_ZONE_VALID(zone));
|
||||
|
||||
LOCK_ZONE(zone);
|
||||
if (zone->catzs != NULL) {
|
||||
dns_catz_catzs_detach(&zone->catzs);
|
||||
}
|
||||
UNLOCK_ZONE(zone);
|
||||
}
|
||||
|
||||
bool
|
||||
dns_zone_catz_is_enabled(dns_zone_t *zone) {
|
||||
REQUIRE(DNS_ZONE_VALID(zone));
|
||||
|
||||
return (zone->catzs != NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If a zone is a catalog zone, attach it to update notification in database.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user