]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Don't freeze / thaw non-explict in-view zones
authorMark Andrews <marka@isc.org>
Tue, 3 Aug 2021 05:40:47 +0000 (15:40 +1000)
committerMark Andrews <marka@isc.org>
Wed, 11 Aug 2021 23:52:03 +0000 (09:52 +1000)
lib/dns/include/dns/zt.h
lib/dns/view.c
lib/dns/zt.c

index ef5982732b6d6af949ac0c4a413923eb2f32207c..4a1b2639a8f475d6f5ce99667b81fa42d7499b15 100644 (file)
@@ -160,7 +160,7 @@ dns_zt_asyncload(dns_zt_t *zt, bool newonly, dns_zt_allloaded_t alldone,
  */
 
 isc_result_t
-dns_zt_freezezones(dns_zt_t *zt, bool freeze);
+dns_zt_freezezones(dns_zt_t *zt, dns_view_t *view, bool freeze);
 /*%<
  * Freeze/thaw updates to master zones.
  * Any pending updates will be flushed.
index 5de3108d45d71545682751284cdff6c6d52cb304..27df70381103d1285b23c4ecc1c3ccc5c022728d 100644 (file)
@@ -1855,7 +1855,7 @@ dns_view_freezezones(dns_view_t *view, bool value) {
        REQUIRE(DNS_VIEW_VALID(view));
        REQUIRE(view->zonetable != NULL);
 
-       return (dns_zt_freezezones(view->zonetable, value));
+       return (dns_zt_freezezones(view->zonetable, view, value));
 }
 
 void
index cfe7d31e4542202765315043ac59ffcf305e6c9a..3fde5f16e18144dbf066ae257941f238b8725b68 100644 (file)
@@ -55,6 +55,11 @@ struct dns_zt {
        dns_rbt_t *table;
 };
 
+struct zt_freeze_params {
+       dns_view_t *view;
+       bool freeze;
+};
+
 #define ZTMAGIC             ISC_MAGIC('Z', 'T', 'b', 'l')
 #define VALID_ZT(zt) ISC_MAGIC_VALID(zt, ZTMAGIC)
 
@@ -375,13 +380,14 @@ asyncload(dns_zone_t *zone, void *zt_) {
 }
 
 isc_result_t
-dns_zt_freezezones(dns_zt_t *zt, bool freeze) {
+dns_zt_freezezones(dns_zt_t *zt, dns_view_t *view, bool freeze) {
        isc_result_t result, tresult;
+       struct zt_freeze_params params = { view, freeze };
 
        REQUIRE(VALID_ZT(zt));
 
        RWLOCK(&zt->rwlock, isc_rwlocktype_read);
-       result = dns_zt_apply(zt, false, &tresult, freezezones, &freeze);
+       result = dns_zt_apply(zt, false, &tresult, freezezones, &params);
        RWUNLOCK(&zt->rwlock, isc_rwlocktype_read);
        if (tresult == ISC_R_NOTFOUND) {
                tresult = ISC_R_SUCCESS;
@@ -391,7 +397,7 @@ dns_zt_freezezones(dns_zt_t *zt, bool freeze) {
 
 static isc_result_t
 freezezones(dns_zone_t *zone, void *uap) {
-       bool freeze = *(bool *)uap;
+       struct zt_freeze_params *params = uap;
        bool frozen;
        isc_result_t result = ISC_R_SUCCESS;
        char classstr[DNS_RDATACLASS_FORMATSIZE];
@@ -406,6 +412,12 @@ freezezones(dns_zone_t *zone, void *uap) {
        if (raw != NULL) {
                zone = raw;
        }
+       if (params->view != dns_zone_getview(zone)) {
+               if (raw != NULL) {
+                       dns_zone_detach(&raw);
+               }
+               return (ISC_R_SUCCESS);
+       }
        if (dns_zone_gettype(zone) != dns_zone_master) {
                if (raw != NULL) {
                        dns_zone_detach(&raw);
@@ -420,7 +432,7 @@ freezezones(dns_zone_t *zone, void *uap) {
        }
 
        frozen = dns_zone_getupdatedisabled(zone);
-       if (freeze) {
+       if (params->freeze) {
                if (frozen) {
                        result = DNS_R_FROZEN;
                }
@@ -428,7 +440,7 @@ freezezones(dns_zone_t *zone, void *uap) {
                        result = dns_zone_flush(zone);
                }
                if (result == ISC_R_SUCCESS) {
-                       dns_zone_setupdatedisabled(zone, freeze);
+                       dns_zone_setupdatedisabled(zone, params->freeze);
                }
        } else {
                if (frozen) {
@@ -455,8 +467,8 @@ freezezones(dns_zone_t *zone, void *uap) {
        level = (result != ISC_R_SUCCESS) ? ISC_LOG_ERROR : ISC_LOG_DEBUG(1);
        isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_ZONE,
                      level, "%s zone '%s/%s'%s%s: %s",
-                     freeze ? "freezing" : "thawing", zonename, classstr, sep,
-                     vname, isc_result_totext(result));
+                     params->freeze ? "freezing" : "thawing", zonename,
+                     classstr, sep, vname, isc_result_totext(result));
        if (raw != NULL) {
                dns_zone_detach(&raw);
        }