mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
- Synthesize ANY responses from cache. Does not search exhaustively,
but MX,A,AAAA,SOA,NS also CNAME. - Fix leaked dns64prefix configuration string. git-svn-id: file:///svn/unbound/trunk@3405 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
5556c4fb3c
commit
ff898bfdd6
3 changed files with 75 additions and 0 deletions
|
|
@ -1,3 +1,8 @@
|
||||||
|
17 April 2015: Wouter
|
||||||
|
- Synthesize ANY responses from cache. Does not search exhaustively,
|
||||||
|
but MX,A,AAAA,SOA,NS also CNAME.
|
||||||
|
- Fix leaked dns64prefix configuration string.
|
||||||
|
|
||||||
16 April 2015: Wouter
|
16 April 2015: Wouter
|
||||||
- Add local-zone type inform_deny, that logs query and drops answer.
|
- Add local-zone type inform_deny, that logs query and drops answer.
|
||||||
- Ratelimit does not apply to prefetched queries, and ratelimit-factor
|
- Ratelimit does not apply to prefetched queries, and ratelimit-factor
|
||||||
|
|
|
||||||
69
services/cache/dns.c
vendored
69
services/cache/dns.c
vendored
|
|
@ -389,6 +389,18 @@ dns_msg_authadd(struct dns_msg* msg, struct regional* region,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** add rrset to answer section */
|
||||||
|
static int
|
||||||
|
dns_msg_ansadd(struct dns_msg* msg, struct regional* region,
|
||||||
|
struct ub_packed_rrset_key* rrset, time_t now)
|
||||||
|
{
|
||||||
|
if(!(msg->rep->rrsets[msg->rep->rrset_count++] =
|
||||||
|
packed_rrset_copy_region(rrset, region, now)))
|
||||||
|
return 0;
|
||||||
|
msg->rep->an_numrrsets++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
struct delegpt*
|
struct delegpt*
|
||||||
dns_cache_find_delegation(struct module_env* env, uint8_t* qname,
|
dns_cache_find_delegation(struct module_env* env, uint8_t* qname,
|
||||||
size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
|
|
@ -635,6 +647,58 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Fill TYPE_ANY response with some data from cache */
|
||||||
|
static struct dns_msg*
|
||||||
|
fill_any(struct module_env* env,
|
||||||
|
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
|
struct regional* region)
|
||||||
|
{
|
||||||
|
time_t now = *env->now;
|
||||||
|
struct dns_msg* msg = NULL;
|
||||||
|
uint16_t lookup[] = {LDNS_RR_TYPE_A, LDNS_RR_TYPE_AAAA,
|
||||||
|
LDNS_RR_TYPE_MX, LDNS_RR_TYPE_SOA, LDNS_RR_TYPE_NS, 0};
|
||||||
|
int i, num=5; /* number of RR types to look up */
|
||||||
|
log_assert(lookup[num] == 0);
|
||||||
|
|
||||||
|
for(i=0; i<num; i++) {
|
||||||
|
/* look up this RR for inclusion in type ANY response */
|
||||||
|
struct ub_packed_rrset_key* rrset = rrset_cache_lookup(
|
||||||
|
env->rrset_cache, qname, qnamelen, lookup[i],
|
||||||
|
qclass, 0, now, 0);
|
||||||
|
struct packed_rrset_data *d;
|
||||||
|
if(!rrset)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* only if rrset from answer section */
|
||||||
|
d = (struct packed_rrset_data*)rrset->entry.data;
|
||||||
|
if(d->trust == rrset_trust_add_noAA ||
|
||||||
|
d->trust == rrset_trust_auth_noAA ||
|
||||||
|
d->trust == rrset_trust_add_AA ||
|
||||||
|
d->trust == rrset_trust_auth_AA) {
|
||||||
|
lock_rw_unlock(&rrset->entry.lock);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create msg if none */
|
||||||
|
if(!msg) {
|
||||||
|
msg = dns_msg_create(qname, qnamelen, qtype, qclass,
|
||||||
|
region, num-i);
|
||||||
|
if(!msg) {
|
||||||
|
lock_rw_unlock(&rrset->entry.lock);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add RRset to response */
|
||||||
|
if(!dns_msg_ansadd(msg, region, rrset, now)) {
|
||||||
|
lock_rw_unlock(&rrset->entry.lock);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
lock_rw_unlock(&rrset->entry.lock);
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
struct dns_msg*
|
struct dns_msg*
|
||||||
dns_cache_lookup(struct module_env* env,
|
dns_cache_lookup(struct module_env* env,
|
||||||
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
|
|
@ -747,6 +811,11 @@ dns_cache_lookup(struct module_env* env,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fill common RR types for ANY response to avoid requery */
|
||||||
|
if(qtype == LDNS_RR_TYPE_ANY) {
|
||||||
|
return fill_any(env, qname, qnamelen, qtype, qclass, region);
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -937,6 +937,7 @@ config_delete(struct config_file* cfg)
|
||||||
free(cfg->server_cert_file);
|
free(cfg->server_cert_file);
|
||||||
free(cfg->control_key_file);
|
free(cfg->control_key_file);
|
||||||
free(cfg->control_cert_file);
|
free(cfg->control_cert_file);
|
||||||
|
free(cfg->dns64_prefix);
|
||||||
free(cfg->dnstap_socket_path);
|
free(cfg->dnstap_socket_path);
|
||||||
free(cfg->dnstap_identity);
|
free(cfg->dnstap_identity);
|
||||||
free(cfg->dnstap_version);
|
free(cfg->dnstap_version);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue