]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fixup for root prime requests sent when not needed.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 23 Jul 2009 13:21:42 +0000 (13:21 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 23 Jul 2009 13:21:42 +0000 (13:21 +0000)
git-svn-id: file:///svn/unbound/trunk@1736 be551aaa-1e26-0410-a405-d3ace91eadb9

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

index cf9fef342372da5223670e63aa51ffb34139f9b9..c4a3dd28f2356bb9a53a098c36e0a97120db4a59 100644 (file)
@@ -1,3 +1,8 @@
+22 July 2009: Wouter
+       - Fix bug found by Michael Tokarev where unbound would try to
+         prime the root servers even though forwarders are configured for
+         the root.
+
 21 July 2009: Wouter
        - Fix server selection, so that it waits for open target queries when
          faced with lameness.
index 61e69d633b4d3f2241d7d64a2915682771f119da..488a7d3a194b695302bc0e505f3d58e7d7039084 100644 (file)
@@ -345,6 +345,13 @@ forwards_lookup(struct iter_forwards* fwd, uint8_t* qname, uint16_t qclass)
        return NULL;
 }
 
+struct delegpt* 
+forwards_lookup_root(struct iter_forwards* fwd, uint16_t qclass)
+{
+       uint8_t root = 0;
+       return forwards_lookup(fwd, &root, qclass);
+}
+
 size_t 
 forwards_get_mem(struct iter_forwards* fwd)
 {
index 39b6ec18c9aee9406f4768e2aa98b10e47b0660f..de58f5a5a5de8878cbf01b429d17aa9b4dc2a3ae 100644 (file)
@@ -119,6 +119,15 @@ int forwards_apply_cfg(struct iter_forwards* fwd, struct config_file* cfg);
 struct delegpt* forwards_lookup(struct iter_forwards* fwd, 
        uint8_t* qname, uint16_t qclass);
 
+/**
+ * Same as forwards_lookup, but for the root only
+ * @param fwd: forward storage.
+ * @param qclass: The qclass of the query.
+ * @return: A delegation point if root forward exists, otherwise null.
+ */
+struct delegpt* forwards_lookup_root(struct iter_forwards* fwd, 
+       uint16_t qclass);
+
 /**
  * Get memory in use by forward storage
  * @param fwd: forward storage.
index 86c4371e4c09f57ce97545a59a4f65350fd5c1d7..201938832f8d500c4578e2359d8721c48abd3a2a 100644 (file)
@@ -951,6 +951,25 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
                /* If the cache has returned nothing, then we have a 
                 * root priming situation. */
                if(iq->dp == NULL) {
+                       if(forwards_lookup_root(qstate->env->fwds, 
+                               iq->qchase.qclass)) {
+                               /* forward zone root, no root prime needed */
+                               /* fill in some dp - safety belt */
+                               iq->dp = hints_lookup_root(ie->hints, 
+                                       iq->qchase.qclass);
+                               if(!iq->dp) {
+                                       log_err("internal error: no hints dp");
+                                       return error_response(qstate, id, 
+                                               LDNS_RCODE_SERVFAIL);
+                               }
+                               iq->dp = delegpt_copy(iq->dp, qstate->region);
+                               if(!iq->dp) {
+                                       log_err("out of memory in safety belt");
+                                       return error_response(qstate, id, 
+                                               LDNS_RCODE_SERVFAIL);
+                               }
+                               return next_state(iq, INIT_REQUEST_2_STATE);
+                       }
                        /* Note that the result of this will set a new
                         * DelegationPoint based on the result of priming. */
                        if(!prime_root(qstate, iq, ie, id, iq->qchase.qclass))
diff --git a/testdata/iter_fwdstubroot.rpl b/testdata/iter_fwdstubroot.rpl
new file mode 100644 (file)
index 0000000..e43584c
--- /dev/null
@@ -0,0 +1,175 @@
+; config options
+server:
+       target-fetch-policy: "0 0 0 0 0"
+
+stub-zone:
+       name: "."
+       stub-addr: 193.0.14.129         # K.ROOT-SERVERS.NET.
+forward-zone:
+       name: "."
+       forward-addr: 10.0.0.1
+stub-zone:
+       name: "sub.example.com"
+       stub-addr: 10.0.0.2
+CONFIG_END
+
+SCENARIO_BEGIN Test iterative resolve with a stub under a forward root zone
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+       ADDRESS 193.0.14.129 
+
+; No answers from the actual root, blocked.
+
+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 qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.com.
+SECTION ADDITIONAL
+ns.example.com.                IN      A       1.2.3.4
+ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com.   IN NS   ns.example.com.
+SECTION ADDITIONAL
+ns.example.com.                IN      A       1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A  10.20.30.40
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.com.
+SECTION ADDITIONAL
+ns.example.com.                IN      A       1.2.3.4
+ENTRY_END
+RANGE_END
+
+; forwarder for example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 10.0.0.1
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com.   IN NS   ns.example.com.
+SECTION ADDITIONAL
+ns.example.com.                IN      A       1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A  10.0.0.4
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.com.
+SECTION ADDITIONAL
+ns.example.com.                IN      A       1.2.3.4
+ENTRY_END
+
+; fail all other queries
+ENTRY_BEGIN
+MATCH opcode 
+ADJUST copy_id copy_query
+REPLY QR SERVFAIL
+SECTION QUESTION
+example.com. IN A
+ENTRY_END
+RANGE_END
+
+; stub for sub.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 10.0.0.2
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+sub.example.com. IN NS
+SECTION ANSWER
+sub.example.com.       IN NS   ns.sub.example.com.
+SECTION ADDITIONAL
+ns.sub.example.com.            IN      A       1.2.3.44
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.sub.example.com. IN A
+SECTION ANSWER
+www.sub.example.com. IN A      10.0.0.5
+SECTION AUTHORITY
+sub.example.com.       IN NS   ns.sub.example.com.
+SECTION ADDITIONAL
+ns.sub.example.com.            IN      A       1.2.3.44
+ENTRY_END
+RANGE_END
+
+; try to resolve from stub zone
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.sub.example.com. IN A
+ENTRY_END
+
+STEP 30 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.sub.example.com. IN A
+SECTION ANSWER
+www.sub.example.com. IN A      10.0.0.5
+SECTION AUTHORITY
+sub.example.com.       IN NS   ns.sub.example.com.
+SECTION ADDITIONAL
+ns.sub.example.com.            IN      A       1.2.3.44
+ENTRY_END
+
+SCENARIO_END