]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fix parent child disagreement handling and no-ipv6 present.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 8 Jan 2010 12:47:27 +0000 (12:47 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 8 Jan 2010 12:47:27 +0000 (12:47 +0000)
git-svn-id: file:///svn/unbound/trunk@1953 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
iterator/iter_delegpt.c
iterator/iter_delegpt.h
iterator/iterator.c
testdata/iter_pcttl.rpl [new file with mode: 0644]

index f4e6e662e42d94af995216e02f74bacd46b6fe94..b49de1d80145e78fdfcc2fc262bde304d40ca793 100644 (file)
@@ -1,3 +1,11 @@
+8 January 2010: Wouter
+       - Fix for parent-child disagreement code which could have trouble
+         when (a) ipv6 was disabled and (b) the TTL for parent and child
+         were different.  There were two bugs, the parent-side information
+         is fixed to no longer block lookup of child side information and
+         the iterator is fixed to no longer attempt to get ipv6 when it is
+         not enabled and then give up in failure.
+
 7 January 2010: Wouter
        - Fixup python documentation (thanks Leo Vandewoestijne).
        - Work on cache prefetch feature.
index f50ec8ac2cc217597ddc876c50251831b73e3a5c..20284cf9ebec358b692466ff52e7076b2af237d3 100644 (file)
@@ -154,11 +154,13 @@ delegpt_add_target(struct delegpt* dp, struct regional* region,
                /* ignore it */
                return 1;
        }
-       if(addr_is_ip6(addr, addrlen))
-               ns->got6 = 1;
-       else    ns->got4 = 1;
-       if(ns->got4 && ns->got6)
-               ns->resolved = 1;
+       if(!lame) {
+               if(addr_is_ip6(addr, addrlen))
+                       ns->got6 = 1;
+               else    ns->got4 = 1;
+               if(ns->got4 && ns->got6)
+                       ns->resolved = 1;
+       }
        return delegpt_add_addr(dp, region, addr, addrlen, bogus, lame, nodup);
 }
 
@@ -254,10 +256,11 @@ void delegpt_log(enum verbosity_value v, struct delegpt* dp)
                        (dp->bogus?" BOGUS":"") );
                }
                for(a = dp->target_list; a; a = a->next_target) {
-                       if(a->bogus) 
-                               log_addr(VERB_ALGO, "  BOGUS ", 
-                                       &a->addr, a->addrlen);
-                       else log_addr(VERB_ALGO, "  ", &a->addr, a->addrlen);
+                       const char* str = "  ";
+                       if(a->bogus && a->lame) str = "  BOGUS ADDR_LAME ";
+                       else if(a->bogus) str = "  BOGUS ";
+                       else if(a->lame) str = "  ADDR_LAME ";
+                       log_addr(VERB_ALGO, str, &a->addr, a->addrlen);
                }
        }
 }
@@ -448,3 +451,13 @@ void delegpt_add_neg_msg(struct delegpt* dp, struct msgreply_entry* msg)
                }
        }
 }
+
+void delegpt_no_ipv6(struct delegpt* dp)
+{
+       struct delegpt_ns* ns;
+       for(ns = dp->nslist; ns; ns = ns->next) {
+               /* no ipv6, so only ipv4 is enough to resolve a nameserver */
+               if(ns->got4)
+                       ns->resolved = 1;
+       }
+}
index b1d8264f4f1a308cdce6e4b4c58ce2c63dc8b8b6..bdea325d2cff29e140b84ef540e45a75149af5ad 100644 (file)
@@ -314,4 +314,11 @@ struct delegpt* delegpt_from_message(struct dns_msg* msg,
  */
 void delegpt_add_neg_msg(struct delegpt* dp, struct msgreply_entry* msg);
 
+/**
+ * Register the fact that there is no ipv6 and thus AAAAs are not going 
+ * to be queried for or be useful.
+ * @param dp: the delegation point. Updated to reflect no ipv6.
+ */
+void delegpt_no_ipv6(struct delegpt* dp);
+
 #endif /* ITERATOR_ITER_DELEGPT_H */
index fa6baf956fcab6f0248c008ddc6bfeea8d8808b9..3c2cf8bd876d19370d8aad3b21f38e90334522de 100644 (file)
@@ -1305,6 +1305,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                verbose(VERB_QUERY, "Failed to get a delegation, giving up");
                return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
        }
+       if(!ie->supports_ipv6)
+               delegpt_no_ipv6(iq->dp);
        delegpt_log(VERB_ALGO, iq->dp);
 
        if(iq->num_current_queries>0) {
diff --git a/testdata/iter_pcttl.rpl b/testdata/iter_pcttl.rpl
new file mode 100644 (file)
index 0000000..41d94bc
--- /dev/null
@@ -0,0 +1,245 @@
+; config options
+server:
+       target-fetch-policy: "0 0 0 0 0"
+       do-ip6: no
+
+stub-zone:
+       name: "."
+       stub-addr: 193.0.14.129         # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test cache ttls where parent child differ in ttl
+; and the lameness for parent suddenly becomes the only information point.
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+       ADDRESS 193.0.14.129 
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS        K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET.    IN      A       193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION AUTHORITY
+com.   IN NS   a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net.    IN      A       192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+net. IN NS
+SECTION AUTHORITY
+net.   IN NS   e.gtld-servers.net.
+SECTION ADDITIONAL
+e.gtld-servers.net.    IN      A       192.12.94.30
+ENTRY_END
+
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+       ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com.   IN NS   a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net.    IN      A       192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION AUTHORITY
+example.com.   IN NS   ns.foo.com.
+SECTION ADDITIONAL
+;ns.foo.com.   200     IN      A       1.2.3.44
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+foo.com. IN NS
+SECTION AUTHORITY
+foo.com.       200 IN NS       ns.foo.com.
+SECTION ADDITIONAL
+ns.foo.com.    200     IN      A       1.2.3.44
+ENTRY_END
+
+RANGE_END
+
+; e.gtld-servers.net.
+RANGE_BEGIN 0 100
+       ADDRESS 192.12.94.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+net. IN NS
+SECTION ANSWER
+net.   IN NS   e.gtld-servers.net.
+SECTION ADDITIONAL
+e.gtld-servers.net.    IN      A       192.12.94.30
+ENTRY_END
+
+RANGE_END
+
+; ns.foo.com.
+; The parent-IP version
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.44
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY AA QR NOERROR
+SECTION QUESTION
+foo.com. IN NS
+SECTION ANSWER
+foo.com.       200 IN NS       ns.foo.com.
+SECTION ADDITIONAL
+ns.foo.com.    100     IN      A       1.2.3.44
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY AA QR NOERROR
+SECTION QUESTION
+ns.foo.com. IN A
+SECTION ANSWER
+ns.foo.com. 100 IN A   1.2.3.44
+SECTION AUTHORITY
+foo.com.       200 IN NS       ns.foo.com.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY AA QR NOERROR
+SECTION QUESTION
+ns.foo.com. IN AAAA
+SECTION AUTHORITY
+foo.com.    100 IN SOA . . 1 2 3 4 5
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY AA QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com.   200 IN NS       ns.foo.com.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY AA QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 100 IN A      10.20.30.40
+SECTION AUTHORITY
+example.com.   200 IN NS       ns.foo.com.
+SECTION ADDITIONAL
+ns.foo.com     100 IN A        1.2.3.44
+ENTRY_END
+RANGE_END
+
+; NOT USED.  The parent side equals child side but not in the cache.
+; and they have different TTLs only.
+; ns.foo.com
+; The child IP version.   Does not respond to anything (servfail instead
+; of timeouts since this is easier to encode in .rpl file format).
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.55
+ENTRY_BEGIN
+MATCH opcode 
+ADJUST copy_id copy_query
+REPLY QR SERVFAIL
+SECTION QUESTION
+foo.com. IN NS
+SECTION ANSWER
+ENTRY_END
+
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 20 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 100 IN A      10.20.30.40
+SECTION AUTHORITY
+example.com.   100 IN NS       ns.foo.com.
+; scrubbed off
+;SECTION ADDITIONAL
+;ns.foo.com    IN A    1.2.3.44
+ENTRY_END
+
+; Now we wait 101 seconds, and the child data is gone,
+; but the parent-side was cached for 200 and it still there.
+
+STEP 30 TIME_PASSES ELAPSE 101
+
+STEP 40 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 50 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 100 IN A      10.20.30.40
+SECTION AUTHORITY
+example.com.   100 IN NS       ns.foo.com.
+; scrubbed off
+;SECTION ADDITIONAL
+;ns.foo.com    IN A    1.2.3.44
+ENTRY_END
+
+SCENARIO_END