aboutsummaryrefslogtreecommitdiff
path: root/services/cache/dns.c
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2018-05-12 11:54:35 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2018-05-12 11:54:35 +0000
commit15de2de8449b4f5063f93578ae68aa0bc79a205c (patch)
treef0a7e3230212205e7ff88a2900de97026940f63c /services/cache/dns.c
parent689b65913bba5320ef50befddf4743c6dafde873 (diff)
Vendor import of Unbound 1.6.4.vendor/unbound/1.6.4
Notes
Notes: svn path=/vendor/unbound/dist/; revision=333537 svn path=/vendor/unbound/1.6.4/; revision=333538; tag=vendor/unbound/1.6.4
Diffstat (limited to 'services/cache/dns.c')
-rw-r--r--services/cache/dns.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/services/cache/dns.c b/services/cache/dns.c
index a8fde9f2890e..764205e53cbe 100644
--- a/services/cache/dns.c
+++ b/services/cache/dns.c
@@ -41,6 +41,7 @@
#include "config.h"
#include "iterator/iter_delegpt.h"
#include "validator/val_nsec.h"
+#include "validator/val_utils.h"
#include "services/cache/dns.h"
#include "services/cache/rrset.h"
#include "util/data/msgreply.h"
@@ -182,7 +183,7 @@ addr_to_additional(struct ub_packed_rrset_key* rrset, struct regional* region,
}
/** lookup message in message cache */
-static struct msgreply_entry*
+struct msgreply_entry*
msg_cache_lookup(struct module_env* env, uint8_t* qname, size_t qnamelen,
uint16_t qtype, uint16_t qclass, uint16_t flags, time_t now, int wr)
{
@@ -755,10 +756,16 @@ dns_cache_lookup(struct module_env* env,
if( qtype != LDNS_RR_TYPE_DS &&
(rrset=rrset_cache_lookup(env->rrset_cache, qname, qnamelen,
LDNS_RR_TYPE_CNAME, qclass, 0, now, 0))) {
- struct dns_msg* msg = rrset_msg(rrset, region, now, &k);
- if(msg) {
- lock_rw_unlock(&rrset->entry.lock);
- return msg;
+ uint8_t* wc = NULL;
+ /* if the rrset is not a wildcard expansion, with wcname */
+ /* because, if we return that CNAME rrset on its own, it is
+ * missing the NSEC or NSEC3 proof */
+ if(!(val_rrset_wildcard(rrset, &wc) && wc != NULL)) {
+ struct dns_msg* msg = rrset_msg(rrset, region, now, &k);
+ if(msg) {
+ lock_rw_unlock(&rrset->entry.lock);
+ return msg;
+ }
}
lock_rw_unlock(&rrset->entry.lock);
}