Merge branch '2123-lock-order-inversions-in-main' into 'main'

Resolve "Lock order inversions in main"

Closes #2123

See merge request isc-projects/bind9!4090
This commit is contained in:
Mark Andrews 2020-09-17 08:12:21 +00:00
commit 56ff7bece9

View file

@ -4556,7 +4556,11 @@ sync_keyzone(dns_zone_t *zone, dns_db_t *db) {
if (rdataset->type != dns_rdatatype_keydata) {
continue;
}
/*
* Release db wrlock to prevent LOR reports against
* dns_keytable_forall() call below.
*/
dns_rriterator_pause(&rrit);
result = dns_keytable_find(sr, rrname, &keynode);
if (result != ISC_R_SUCCESS || !dns_keynode_managed(keynode)) {
CHECK(delete_keydata(db, ver, &diff, rrname, rdataset));
@ -8267,6 +8271,8 @@ zone_nsec3chain(dns_zone_t *zone) {
* generated by dns__zone_updatesigs() calls later in this function.
*/
while (nsec3chain != NULL && nodes-- > 0 && signatures > 0) {
dns_dbiterator_pause(nsec3chain->dbiterator);
LOCK_ZONE(zone);
nextnsec3chain = ISC_LIST_NEXT(nsec3chain, link);
@ -8493,6 +8499,8 @@ zone_nsec3chain(dns_zone_t *zone) {
first = true;
buildnsecchain = false;
while (nsec3chain != NULL && nodes-- > 0 && signatures > 0) {
dns_dbiterator_pause(nsec3chain->dbiterator);
LOCK_ZONE(zone);
nextnsec3chain = ISC_LIST_NEXT(nsec3chain, link);
UNLOCK_ZONE(zone);
@ -8531,6 +8539,7 @@ zone_nsec3chain(dns_zone_t *zone) {
}
dns_dbiterator_current(nsec3chain->dbiterator, &node, name);
dns_dbiterator_pause(nsec3chain->dbiterator);
delegation = false;
if (!buildnsecchain) {
@ -8654,12 +8663,12 @@ zone_nsec3chain(dns_zone_t *zone) {
goto same_removechain;
}
if (result == ISC_R_NOMORE) {
dns_dbiterator_pause(nsec3chain->dbiterator);
LOCK_ZONE(zone);
ISC_LIST_UNLINK(zone->nsec3chain, nsec3chain,
link);
UNLOCK_ZONE(zone);
ISC_LIST_APPEND(cleanup, nsec3chain, link);
dns_dbiterator_pause(nsec3chain->dbiterator);
result = fixup_nsec3param(
db, version, nsec3chain, false,
privatetype, &param_diff);
@ -9235,6 +9244,8 @@ zone_sign(dns_zone_t *zone) {
while (signing != NULL && nodes-- > 0 && signatures > 0) {
bool has_alg = false;
dns_dbiterator_pause(signing->dbiterator);
nextsigning = ISC_LIST_NEXT(signing, link);
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
@ -10720,6 +10731,7 @@ zone_refreshkeys(dns_zone_t *zone) {
/* Removal timer expired? */
if (kd.removehd != 0 && kd.removehd < now) {
dns_rriterator_pause(&rrit);
CHECK(update_one_rr(db, ver, &diff,
DNS_DIFFOP_DEL, name, ttl,
&rdata));
@ -10736,6 +10748,7 @@ zone_refreshkeys(dns_zone_t *zone) {
timer = kd.refresh;
}
dns_rriterator_pause(&rrit);
set_refreshkeytimer(zone, &kd, now, false);
timerset = true;
}
@ -10744,6 +10757,8 @@ zone_refreshkeys(dns_zone_t *zone) {
continue;
}
dns_rriterator_pause(&rrit);
kfetch = isc_mem_get(zone->mctx, sizeof(dns_keyfetch_t));
zone->refreshkeycount++;
@ -16024,6 +16039,8 @@ copy_non_dnssec_records(dns_zone_t *zone, dns_db_t *db, dns_db_t *version,
return (ISC_R_SUCCESS);
}
dns_dbiterator_pause(dbiterator);
result = dns_db_findnode(db, name, true, &node);
if (result != ISC_R_SUCCESS) {
goto cleanup;