]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fix storage of noEDNS in the infra cache.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 30 Nov 2010 12:55:48 +0000 (12:55 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 30 Nov 2010 12:55:48 +0000 (12:55 +0000)
iana portlist updated.

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

doc/Changelog
services/cache/infra.c
services/outside_network.c
testcode/do-tests.sh
testcode/unitmain.c
testdata/edns_cache.tpkg [new file with mode: 0644]
util/iana_ports.inc

index da3f4a27edd6ae20a56f5acbeb9b7e937198aa71..bedb5c27a3fbc51b333215af73e7f3ff60793575 100644 (file)
@@ -1,3 +1,7 @@
+30 November 2010: Wouter
+       - Fix storage of EDNS failures in the infra cache.
+       - iana portlist updated.
+
 18 November 2010: Wouter
        - harden-below-nxdomain option, default off (because very old
          software may be incompatible).  We could enable it by default in
index ba02b5083d8bf99eee41585f0e5a2c5b68ea67c6..4e39886e57c15d68c0f6ceef41779fa8d499fe65 100644 (file)
@@ -575,7 +575,8 @@ infra_edns_update(struct infra_cache* infra,
        /* have an entry, update the rtt, and the ttl */
        data = (struct infra_host_data*)e->data;
        /* do not update if noEDNS and stored is yesEDNS */
-       if(!(edns_version == -1 && data->edns_version != -1)) {
+       if(!(edns_version == -1 && (data->edns_version != -1 &&
+               data->edns_lame_known))) {
                data->edns_version = edns_version;
                data->edns_lame_known = 1;
        }
index b9297940a8d6dd52d4404aae08d2a316d744e3c7..4812a9cb2f3adac505e9ec0d1b1cc5a019ab8730 100644 (file)
@@ -1308,6 +1308,7 @@ serviced_udp_send(struct serviced_query* sq, ldns_buffer* buff)
                &edns_lame_known, &rtt))
                return 0;
        sq->last_rtt = rtt;
+       verbose(VERB_ALGO, "EDNS lookup known=%d vs=%d", edns_lame_known, vs);
        if(sq->status == serviced_initial) {
                if(edns_lame_known == 0 && rtt > 5000 && rtt < 10001) {
                        /* perform EDNS lame probe - check if server is
@@ -1593,6 +1594,7 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
                        == LDNS_RCODE_FORMERR || LDNS_RCODE_WIRE(
                        ldns_buffer_begin(c->buffer)) == LDNS_RCODE_NOTIMPL)) {
                /* try to get an answer by falling back without EDNS */
+               verbose(VERB_ALGO, "serviced query: attempt without EDNS");
                sq->status = serviced_query_UDP_EDNS_fallback;
                sq->retry = 0;
                if(!serviced_udp_send(sq, c->buffer)) {
@@ -1614,6 +1616,8 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
            } else if(sq->status == serviced_query_UDP_EDNS && 
                !sq->edns_lame_known) {
                /* now we know that edns queries received answers store that */
+               log_addr(VERB_ALGO, "serviced query: EDNS works for",
+                       &sq->addr, sq->addrlen);
                if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen, 
                        0, (uint32_t)now.tv_sec)) {
                        log_err("Out of memory caching edns works");
@@ -1628,11 +1632,18 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
                /* the fallback produced a result that looks promising, note
                 * that this server should be approached without EDNS */
                /* only store noEDNS in cache if domain is noDNSSEC */
-               if(!sq->want_dnssec)
+               if(!sq->want_dnssec) {
+                 log_addr(VERB_ALGO, "serviced query: EDNS fails for",
+                       &sq->addr, sq->addrlen);
                  if(!infra_edns_update(outnet->infra, &sq->addr, sq->addrlen,
                        -1, (uint32_t)now.tv_sec)) {
                        log_err("Out of memory caching no edns for host");
                  }
+               } else {
+                 log_addr(VERB_ALGO, "serviced query: EDNS fails, but "
+                       "not stored because need DNSSEC for", &sq->addr,
+                       sq->addrlen);
+               }
                sq->status = serviced_query_UDP;
            }
            if(now.tv_sec > sq->last_sent_time.tv_sec ||
index fe67c26d8174d2a5c90f5b8931c9e57a02a10baa..1ffe19c0f0bb79427922064ac75c4d5204c85475 100755 (executable)
@@ -7,7 +7,7 @@ NEED_XXD='fwd_compress_c00c.tpkg fwd_zero.tpkg'
 NEED_NC='fwd_compress_c00c.tpkg fwd_zero.tpkg'
 NEED_CURL='06-ianaports.tpkg root_anchor.tpkg'
 NEED_WHOAMI='07-confroot.tpkg'
-NEED_IPV6='fwd_ancil.tpkg fwd_tcp_tc6.tpkg stub_udp6.tpkg'
+NEED_IPV6='fwd_ancil.tpkg fwd_tcp_tc6.tpkg stub_udp6.tpkg edns_cache.tpkg'
 NEED_NOMINGW='tcp_sigpipe.tpkg 07-confroot.tpkg 08-host-lib.tpkg fwd_ancil.tpkg'
 
 # test if dig and ldns-testns are available.
index 3adff443b477b1e4f34e93a21097ceedc113f5fd..aac49586f9e560b6285957d597e9e5404783041c 100644 (file)
@@ -435,7 +435,7 @@ infra_test(void)
        unit_assert( infra_edns_update(slab, &one, onelen, -1, now) );
        unit_assert( infra_host(slab, &one, onelen, 
                        now, &vs, &edns_lame, &to) );
-       unit_assert( vs == 0 && to == init*2  && edns_lame == 0);
+       unit_assert( vs == -1 && to == init*2  && edns_lame == 1);
 
        now += cfg->host_ttl + 10;
        unit_assert( infra_host(slab, &one, onelen, 
@@ -465,6 +465,22 @@ infra_test(void)
        unit_assert(!dlame && !rlame && alame && olame);
        lock_rw_unlock(&k->entry.lock);
 
+       /* test that noEDNS cannot overwrite known-yesEDNS */
+       now += cfg->host_ttl + 10;
+       unit_assert( infra_host(slab, &one, onelen, 
+                       now, &vs, &edns_lame, &to) );
+       unit_assert( vs == 0 && to == init && edns_lame == 0 );
+
+       unit_assert( infra_edns_update(slab, &one, onelen, 0, now) );
+       unit_assert( infra_host(slab, &one, onelen, 
+                       now, &vs, &edns_lame, &to) );
+       unit_assert( vs == 0 && to == init && edns_lame == 1 );
+
+       unit_assert( infra_edns_update(slab, &one, onelen, -1, now) );
+       unit_assert( infra_host(slab, &one, onelen, 
+                       now, &vs, &edns_lame, &to) );
+       unit_assert( vs == 0 && to == init && edns_lame == 1 );
+
        infra_delete(slab);
        config_delete(cfg);
 }
diff --git a/testdata/edns_cache.tpkg b/testdata/edns_cache.tpkg
new file mode 100644 (file)
index 0000000..c816f2c
Binary files /dev/null and b/testdata/edns_cache.tpkg differ
index bff957383612272e27723e80db21473aa91c187a..021cbe16a7473ab086ac9bed2bf6f6dae0ad28a9 100644 (file)
 40841,
 40842,
 40843,
+40853,
 41111,
 41794,
 41795,