]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
rbtnode->nsec needs to be read while holding the tree lock
authorMark Andrews <marka@isc.org>
Wed, 27 Nov 2019 08:09:14 +0000 (19:09 +1100)
committerOndřej Surý <ondrej@isc.org>
Wed, 27 Nov 2019 17:06:05 +0000 (18:06 +0100)
(cherry picked from commit 7cad3b2e91501e82e6fc3bd72043cd8098117fce)

lib/dns/rbtdb.c

index eb26f3796d1cc4c587bc52870f2cc029e24def7c..bdff3a887893971c3484ad7d2020067dea6b6ea5 100644 (file)
@@ -6748,13 +6748,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)
@@ -6846,11 +6849,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,
@@ -6951,13 +6958,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,
                                            &region, sizeof(rdatasetheader_t));