mirror of
https://github.com/isc-projects/bind9.git
synced 2026-05-28 04:34:54 -04:00
Merge branch '3799-tsan-race-between-dns_rbtnode_t-bitfields-v9_18' into 'v9_18'
[9.18] Add missing node lock when setting node->wild in rbtdb.c See merge request isc-projects/bind9!7414
This commit is contained in:
commit
5e8be202e9
2 changed files with 19 additions and 8 deletions
3
CHANGES
3
CHANGES
|
|
@ -1,3 +1,6 @@
|
|||
6075. [bug] Add missing node lock when setting node->wild in
|
||||
add_wildcard_magic. [GL #3799]
|
||||
|
||||
6074. [func] Refactor the isc_nm_xfr_allowed() function to return
|
||||
isc_result_t instead of boolean. [GL #3808]
|
||||
|
||||
|
|
|
|||
|
|
@ -2682,7 +2682,7 @@ end:
|
|||
* tree_lock(write) must be held.
|
||||
*/
|
||||
static isc_result_t
|
||||
add_wildcard_magic(dns_rbtdb_t *rbtdb, const dns_name_t *name) {
|
||||
add_wildcard_magic(dns_rbtdb_t *rbtdb, const dns_name_t *name, bool lock) {
|
||||
isc_result_t result;
|
||||
dns_name_t foundname;
|
||||
dns_offsets_t offsets;
|
||||
|
|
@ -2702,7 +2702,15 @@ add_wildcard_magic(dns_rbtdb_t *rbtdb, const dns_name_t *name) {
|
|||
node->nsec = DNS_RBT_NSEC_NORMAL;
|
||||
}
|
||||
node->find_callback = 1;
|
||||
if (lock) {
|
||||
NODE_LOCK(&rbtdb->node_locks[node->locknum].lock,
|
||||
isc_rwlocktype_write);
|
||||
}
|
||||
node->wild = 1;
|
||||
if (lock) {
|
||||
NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock,
|
||||
isc_rwlocktype_write);
|
||||
}
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
|
|
@ -2710,7 +2718,7 @@ add_wildcard_magic(dns_rbtdb_t *rbtdb, const dns_name_t *name) {
|
|||
* tree_lock(write) must be held.
|
||||
*/
|
||||
static isc_result_t
|
||||
add_empty_wildcards(dns_rbtdb_t *rbtdb, const dns_name_t *name) {
|
||||
add_empty_wildcards(dns_rbtdb_t *rbtdb, const dns_name_t *name, bool lock) {
|
||||
isc_result_t result;
|
||||
dns_name_t foundname;
|
||||
dns_offsets_t offsets;
|
||||
|
|
@ -2724,7 +2732,7 @@ add_empty_wildcards(dns_rbtdb_t *rbtdb, const dns_name_t *name) {
|
|||
dns_rbtnode_t *node = NULL; /* dummy */
|
||||
dns_name_getlabelsequence(name, n - i, i, &foundname);
|
||||
if (dns_name_iswildcard(&foundname)) {
|
||||
result = add_wildcard_magic(rbtdb, &foundname);
|
||||
result = add_wildcard_magic(rbtdb, &foundname, lock);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
|
|
@ -2776,11 +2784,11 @@ findnodeintree(dns_rbtdb_t *rbtdb, dns_rbt_t *tree, const dns_name_t *name,
|
|||
dns_rbt_namefromnode(node, &nodename);
|
||||
node->locknum = node->hashval % rbtdb->node_lock_count;
|
||||
if (tree == rbtdb->tree) {
|
||||
add_empty_wildcards(rbtdb, name);
|
||||
add_empty_wildcards(rbtdb, name, true);
|
||||
|
||||
if (dns_name_iswildcard(name)) {
|
||||
result = add_wildcard_magic(rbtdb,
|
||||
name);
|
||||
result = add_wildcard_magic(rbtdb, name,
|
||||
true);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
RWUNLOCK(&rbtdb->tree_lock,
|
||||
locktype);
|
||||
|
|
@ -7422,7 +7430,7 @@ loading_addrdataset(void *arg, const dns_name_t *name,
|
|||
if (rdataset->type != dns_rdatatype_nsec3 &&
|
||||
rdataset->covers != dns_rdatatype_nsec3)
|
||||
{
|
||||
add_empty_wildcards(rbtdb, name);
|
||||
add_empty_wildcards(rbtdb, name, false);
|
||||
}
|
||||
|
||||
if (dns_name_iswildcard(name)) {
|
||||
|
|
@ -7438,7 +7446,7 @@ loading_addrdataset(void *arg, const dns_name_t *name,
|
|||
if (rdataset->type == dns_rdatatype_nsec3) {
|
||||
return (DNS_R_INVALIDNSEC3);
|
||||
}
|
||||
result = add_wildcard_magic(rbtdb, name);
|
||||
result = add_wildcard_magic(rbtdb, name, false);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue