diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 1cac1de400..eb300e1bfc 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -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, ¶m_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;