From: Aram Sargsyan Date: Mon, 11 Oct 2021 18:13:39 +0000 (+0000) Subject: Fix catalog zone reconfiguration crash X-Git-Tag: v9.17.21~23^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=43ac2cd229813c04438e027c42c0b93b9661adda;p=thirdparty%2Fbind9.git 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. --- diff --git a/bin/named/server.c b/bin/named/server.c index e39ad83b027..b2d47186228 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -6657,6 +6657,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); } /* diff --git a/lib/dns/include/dns/zone.h b/lib/dns/include/dns/zone.h index e05b653d6cd..d82d6eb0dad 100644 --- a/lib/dns/include/dns/zone.h +++ b/lib/dns/include/dns/zone.h @@ -2635,6 +2635,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); /*%< diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 20d31386f08..92d23558c58 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -1967,6 +1967,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. */