mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-30 22:15:20 +00:00
Merge branch '1119-tsan-lib/dns/rbtdb.c' into 'master'
Fix unprotected access to rbtnode in lib/dns/rbtdb.c:add32() See merge request isc-projects/bind9!2371
This commit is contained in:
@@ -6263,16 +6263,18 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
|||||||
INSIST(!loading);
|
INSIST(!loading);
|
||||||
INSIST(rbtversion == NULL ||
|
INSIST(rbtversion == NULL ||
|
||||||
rbtversion->serial >= topheader->serial);
|
rbtversion->serial >= topheader->serial);
|
||||||
if (topheader_prev != NULL)
|
if (topheader_prev != NULL) {
|
||||||
topheader_prev->next = newheader;
|
topheader_prev->next = newheader;
|
||||||
else
|
} else {
|
||||||
rbtnode->data = newheader;
|
rbtnode->data = newheader;
|
||||||
|
}
|
||||||
newheader->next = topheader->next;
|
newheader->next = topheader->next;
|
||||||
newheader->down = topheader;
|
newheader->down = topheader;
|
||||||
topheader->next = newheader;
|
topheader->next = newheader;
|
||||||
rbtnode->dirty = 1;
|
rbtnode->dirty = 1;
|
||||||
if (changed != NULL)
|
if (changed != NULL) {
|
||||||
changed->dirty = true;
|
changed->dirty = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* No rdatasets of the given type exist at the node.
|
* No rdatasets of the given type exist at the node.
|
||||||
@@ -7058,8 +7060,15 @@ loading_addrdataset(void *arg, const dns_name_t *name,
|
|||||||
newheader->resign_lsb = 0;
|
newheader->resign_lsb = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NODE_LOCK(&rbtdb->node_locks[node->locknum].lock,
|
||||||
|
isc_rwlocktype_write);
|
||||||
|
|
||||||
result = add32(rbtdb, node, rbtdb->current_version, newheader,
|
result = add32(rbtdb, node, rbtdb->current_version, newheader,
|
||||||
DNS_DBADD_MERGE, true, NULL, 0);
|
DNS_DBADD_MERGE, true, NULL, 0);
|
||||||
|
|
||||||
|
NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock,
|
||||||
|
isc_rwlocktype_write);
|
||||||
|
|
||||||
if (result == ISC_R_SUCCESS &&
|
if (result == ISC_R_SUCCESS &&
|
||||||
delegating_type(rbtdb, node, rdataset->type))
|
delegating_type(rbtdb, node, rdataset->type))
|
||||||
node->find_callback = 1;
|
node->find_callback = 1;
|
||||||
|
Reference in New Issue
Block a user