]> 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 04:26:27 +0000 (15:26 +1100)
Add more zone locks around code that touches zone timer setting
in failure modes.

lib/dns/zone.c

index c07dfb129810d9d28ad8b3e071f47104ebb7849e..7f4975240b074084b1e3e76002e028e1e290ce5f 100644 (file)
@@ -7167,12 +7167,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.
@@ -7181,6 +7181,7 @@ failure:
                isc_interval_set(&ival, 300, 0);
                isc_time_nowplusinterval(&zone->resigntime, &ival);
        }
+       UNLOCK_ZONE(zone);
 
        INSIST(version == NULL);
 }
@@ -9679,6 +9680,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) {
@@ -9690,6 +9692,7 @@ cleanup:
        } else {
                isc_time_settoepoch(&zone->signingtime);
        }
+       UNLOCK_ZONE(zone);
 
        INSIST(version == NULL);
 }
@@ -19692,6 +19695,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
@@ -19701,6 +19705,7 @@ failure:
                                 0);
                isc_time_nowplusinterval(&zone->refreshkeytime, &ival);
        }
+       UNLOCK_ZONE(zone);
 
        dns_diff_clear(&diff);
        dns_diff_clear(&_sig_diff);