diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 5aa227c3c5..e5646f3aaa 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -1728,6 +1728,9 @@ clean_zone_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, node->dirty = 0; } +/* + * tree_lock(write) must be held. + */ static void delete_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) { dns_rbtnode_t *nsecnode; @@ -2652,6 +2655,8 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, bool commit) { * E.g. if the wildcard name is "*.sub.example." then we * must ensure that "sub.example." exists and is marked as * a wildcard level. + * + * tree_lock(write) must be held. */ static isc_result_t add_wildcard_magic(dns_rbtdb_t *rbtdb, const dns_name_t *name) { @@ -2676,6 +2681,9 @@ add_wildcard_magic(dns_rbtdb_t *rbtdb, const dns_name_t *name) { return (ISC_R_SUCCESS); } +/* + * tree_lock(write) must be held. + */ static isc_result_t add_empty_wildcards(dns_rbtdb_t *rbtdb, const dns_name_t *name) { isc_result_t result; @@ -6424,13 +6432,16 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, REQUIRE(VALID_RBTDB(rbtdb)); INSIST(rbtversion == NULL || rbtversion->rbtdb == rbtdb); - if (rbtdb->common.methods == &zone_methods) + if (rbtdb->common.methods == &zone_methods) { + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); REQUIRE(((rbtnode->nsec == DNS_RBT_NSEC_NSEC3 && (rdataset->type == dns_rdatatype_nsec3 || rdataset->covers == dns_rdatatype_nsec3)) || (rbtnode->nsec != DNS_RBT_NSEC_NSEC3 && rdataset->type != dns_rdatatype_nsec3 && rdataset->covers != dns_rdatatype_nsec3))); + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + } if (rbtversion == NULL) { if (now == 0) @@ -6521,11 +6532,15 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, /* * Add to the auxiliary NSEC tree if we're adding an NSEC record. */ + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); if (rbtnode->nsec != DNS_RBT_NSEC_HAS_NSEC && rdataset->type == dns_rdatatype_nsec) + { newnsec = true; - else + } else { newnsec = false; + } + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); /* * If we're adding a delegation type, adding to the auxiliary NSEC tree, @@ -6626,13 +6641,16 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, REQUIRE(VALID_RBTDB(rbtdb)); REQUIRE(rbtversion != NULL && rbtversion->rbtdb == rbtdb); - if (rbtdb->common.methods == &zone_methods) + if (rbtdb->common.methods == &zone_methods) { + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); REQUIRE(((rbtnode->nsec == DNS_RBT_NSEC_NSEC3 && (rdataset->type == dns_rdatatype_nsec3 || rdataset->covers == dns_rdatatype_nsec3)) || (rbtnode->nsec != DNS_RBT_NSEC_NSEC3 && rdataset->type != dns_rdatatype_nsec3 && rdataset->covers != dns_rdatatype_nsec3))); + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + } result = dns_rdataslab_fromrdataset(rdataset, rbtdb->common.mctx, ®ion, sizeof(rdatasetheader_t));