]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix #677 Fix DNAME responses from cache that failed internal chain
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 26 Jun 2015 07:27:32 +0000 (07:27 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 26 Jun 2015 07:27:32 +0000 (07:27 +0000)
  test.

git-svn-id: file:///svn/unbound/trunk@3435 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/worker.c
doc/Changelog
services/cache/dns.c
testdata/val_dnametopos.rpl
util/data/msgreply.c
util/data/msgreply.h

index f4e87289a12303db9254b3262c16dd80f7edb070..79aec4d3a4b29d2c205537810bfe292d18f146a8 100644 (file)
@@ -568,7 +568,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
        if(rep->an_numrrsets > 0 && (rep->rrsets[0]->rk.type == 
                htons(LDNS_RR_TYPE_CNAME) || rep->rrsets[0]->rk.type == 
                htons(LDNS_RR_TYPE_DNAME))) {
-               if(!reply_check_cname_chain(rep)) {
+               if(!reply_check_cname_chain(qinfo, rep)) {
                        /* cname chain invalid, redo iterator steps */
                        verbose(VERB_ALGO, "Cache reply: cname chain broken");
                bail_out:
index a9c50afbee1ae0ee3e7d5d1c1657d746ad1d09f7..86c3b82fcd7529058f8d8a133e50bf26f0b26acc 100644 (file)
@@ -1,3 +1,7 @@
+26 June 2015: Wouter
+       - Fix #677 Fix DNAME responses from cache that failed internal chain
+         test.
+
 22 June 2015: Wouter
        - Fix #677 Fix CNAME corresponding to a DNAME was checked incorrectly
          and was therefore always synthesized (thanks to Valentin Dietrich).
index 53127ce597491f88208e8be5fecbdcb694303a18..ba81afde4fda0701db0b6b579990b04a77b55341 100644 (file)
@@ -505,7 +505,7 @@ tomsg(struct module_env* env, struct query_info* q, struct reply_info* r,
                return NULL;
        if(r->an_numrrsets > 0 && (r->rrsets[0]->rk.type == htons(
                LDNS_RR_TYPE_CNAME) || r->rrsets[0]->rk.type == htons(
-               LDNS_RR_TYPE_DNAME)) && !reply_check_cname_chain(r)) {
+               LDNS_RR_TYPE_DNAME)) && !reply_check_cname_chain(q, r)) {
                /* cname chain is now invalid, reconstruct msg */
                rrset_array_unlock(r->ref, r->rrset_count);
                return NULL;
index 6264a6d0ee3943dd37a56d8b41d719fc8cafa274..a78d34ae7de61527054e1cbcabe2f1dcb12ffab4 100644 (file)
@@ -231,4 +231,28 @@ SECTION AUTHORITY
 SECTION ADDITIONAL
 ENTRY_END
 
+; Check cache response for DNAME
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+STEP 30 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+example.com.    3600    IN      DNAME   example.net.
+example.com.    3600    IN      RRSIG   DNAME 3 2 3600 20070926134150 20070829134150 2854 example.com. MCwCFH1xw24Hswia3g10AVL1yFUHUPdFAhQDrA+qZJwqXRPg2C1oiNPk9fosGg== ;{id = 2854}
+www.example.com.        0       IN      CNAME   www.example.net.
+www.example.net.        3600    IN      A       11.12.13.14
+www.example.net.        3600    IN      RRSIG   A 5 3 3600 20070926134150 20070829134150 30899 example.net. CPxF5hK9Kg5eT7W6LgZwr0ePYEm9HMcSY4vvqCS6gDWB4X9jvXLCfBkCLhsNybPBpGWlsLi5wM6MTdJXuPpsRA== ;{id = 30899}
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
 SCENARIO_END
index b1d3df6390f028d8689e417cc3672db70f8e5080..06593ffe1b27af71e2b5864f0eb20bf08573a39f 100644 (file)
@@ -822,13 +822,13 @@ log_query_info(enum verbosity_value v, const char* str,
 }
 
 int
-reply_check_cname_chain(struct reply_info* rep) 
+reply_check_cname_chain(struct query_info* qinfo, struct reply_info* rep) 
 {
        /* check only answer section rrs for matching cname chain.
         * the cache may return changed rdata, but owner names are untouched.*/
        size_t i;
-       uint8_t* sname = rep->rrsets[0]->rk.dname;
-       size_t snamelen = rep->rrsets[0]->rk.dname_len;
+       uint8_t* sname = qinfo->qname;
+       size_t snamelen = qinfo->qname_len;
        for(i=0; i<rep->an_numrrsets; i++) {
                uint16_t t = ntohs(rep->rrsets[i]->rk.type);
                if(t == LDNS_RR_TYPE_DNAME)
index e8d6d762e01af2c37a414f1193fe0715b91e513c..708897950089cd28001e8c4ecbaf3205313fb2b9 100644 (file)
@@ -359,10 +359,11 @@ uint8_t* reply_find_final_cname_target(struct query_info* qinfo,
 
 /**
  * Check if cname chain in cached reply is still valid.
+ * @param qinfo: query info with query name.
  * @param rep: reply to check.
  * @return: true if valid, false if invalid.
  */
-int reply_check_cname_chain(struct reply_info* rep);
+int reply_check_cname_chain(struct query_info* qinfo, struct reply_info* rep);
 
 /**
  * Check security status of all RRs in the message.