dname_count_labels(qname),
LDNS_RR_CLASS_IN, &exact);
if(!z || (only_exact && !exact)) {
- lock_rw_unlock(&zones->lock);
+ if(!zones_keep_lock) {
+ lock_rw_unlock(&zones->lock);
+ }
return NULL;
}
if(wr) {
raddr = (struct clientip_synthesized_rr*)addr_tree_lookup(&set->entries,
addr, addrlen);
if(raddr != NULL) {
+ lock_rw_rdlock(&raddr->lock);
action = raddr->action;
if(verbosity >= VERB_ALGO) {
char ip[256], net[256];
verbose(VERB_ALGO, "rpz: trigger %s %s/%d on %s action=%s",
triggername, net, raddr->node.net, ip, rpz_action_to_string(action));
}
- lock_rw_unlock(&raddr->lock);
}
lock_rw_unlock(&set->lock);
action, &ms->qinfo, NULL, ms, r->log_name);
if(ms->env->worker)
ms->env->worker->stats.rpz_action[action]++;
+ lock_rw_unlock(&z->lock);
return ret;
}
lock_rw_unlock(&az->rpz_lock);
if(raddr == NULL && z == NULL) { return NULL; }
- else if(raddr != NULL) { return rpz_apply_nsip_trigger(ms, r, raddr, a); }
- else if(z != NULL) { return rpz_apply_nsdname_trigger(ms, r, z, &match, a); }
- else { return NULL; }
+ else if(raddr != NULL) {
+ if(z) {
+ lock_rw_unlock(&z->lock);
+ }
+ return rpz_apply_nsip_trigger(ms, r, raddr, a);
+ } else if(z != NULL) {
+ if(raddr) {
+ lock_rw_unlock(&raddr->lock);
+ }
+ return rpz_apply_nsdname_trigger(ms, r, z, &match, a);
+ } else { return NULL; }
}
struct dns_msg* rpz_callback_from_iterator_cname(struct module_qstate* ms,
int clientip_trigger = rpz_apply_maybe_clientip_trigger(az, env, qinfo,
edns, repinfo, taglist, taglen, stats, buf, temp, &z, &a, &r);
- if(clientip_trigger >= 0) { return clientip_trigger; }
+ if(clientip_trigger >= 0) {
+ if(a) {
+ lock_rw_unlock(&a->lock);
+ }
+ if(z) {
+ lock_rw_unlock(&z->lock);
+ }
+ return clientip_trigger;
+ }
if(z == NULL) {
+ if(a) {
+ lock_rw_unlock(&a->lock);
+ }
return 0;
}