* 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;
unsigned int n;
dns_rbtnode_t *node = NULL;
+ isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
dns_name_init(&foundname, offsets);
n = dns_name_countlabels(name);
node->nsec = DNS_RBT_NSEC_NORMAL;
}
node->find_callback = 1;
+ if (lock) {
+ NODE_WRLOCK(&rbtdb->node_locks[node->locknum].lock, &nlocktype);
+ }
node->wild = 1;
+ if (lock) {
+ NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock, &nlocktype);
+ }
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) {
+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;
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);
}
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) {
goto unlock;
}
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)) {
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);
}