]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add more zone locks
authorMatthijs Mekking <matthijs@isc.org>
Thu, 27 Feb 2020 10:59:12 +0000 (11:59 +0100)
committerMark Andrews <marka@isc.org>
Tue, 3 Mar 2020 05:10:45 +0000 (16:10 +1100)
Add more zone locks around code that touches zone timer setting
in failure modes.

(cherry picked from commit 143d1c9767e25d35dd939f43f6bae462ee9db477)

lib/dns/zone.c

index 7e9a20a7383c56bbc15ef15f9c93dc4409e50ec2..b0ce2424074ce3827d0858b820d23f0735318681 100644 (file)
@@ -7131,12 +7131,12 @@ failure:
        } else if (db != NULL) {
                dns_db_detach(&db);
        }
+
+       LOCK_ZONE(zone);
        if (result == ISC_R_SUCCESS) {
-               LOCK_ZONE(zone);
                set_resigntime(zone);
                zone_needdump(zone, DNS_DUMP_DELAY);
                DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY);
-               UNLOCK_ZONE(zone);
        } else {
                /*
                 * Something failed.  Retry in 5 minutes.
@@ -7145,6 +7145,7 @@ failure:
                isc_interval_set(&ival, 300, 0);
                isc_time_nowplusinterval(&zone->resigntime, &ival);
        }
+       UNLOCK_ZONE(zone);
 
        INSIST(version == NULL);
 }
@@ -9643,6 +9644,7 @@ cleanup:
                dns_db_detach(&db);
        }
 
+       LOCK_ZONE(zone);
        if (ISC_LIST_HEAD(zone->signing) != NULL) {
                isc_interval_t interval;
                if (zone->update_disabled || result != ISC_R_SUCCESS) {
@@ -9654,6 +9656,7 @@ cleanup:
        } else {
                isc_time_settoepoch(&zone->signingtime);
        }
+       UNLOCK_ZONE(zone);
 
        INSIST(version == NULL);
 }
@@ -19656,6 +19659,7 @@ zone_rekey(dns_zone_t *zone) {
        result = ISC_R_SUCCESS;
 
 failure:
+       LOCK_ZONE(zone);
        if (result != ISC_R_SUCCESS) {
                /*
                 * Something went wrong; try again in ten minutes or
@@ -19665,6 +19669,7 @@ failure:
                                 0);
                isc_time_nowplusinterval(&zone->refreshkeytime, &ival);
        }
+       UNLOCK_ZONE(zone);
 
        dns_diff_clear(&diff);
        dns_diff_clear(&_sig_diff);