From dcea0777bf5fb0a346ee41717bf2b64eb5f3d20b Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Thu, 23 Jul 2009 13:21:42 +0000 Subject: [PATCH] Fixup for root prime requests sent when not needed. git-svn-id: file:///svn/unbound/trunk@1736 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 5 + iterator/iter_fwd.c | 7 ++ iterator/iter_fwd.h | 9 ++ iterator/iterator.c | 19 ++++ testdata/iter_fwdstubroot.rpl | 175 ++++++++++++++++++++++++++++++++++ 5 files changed, 215 insertions(+) create mode 100644 testdata/iter_fwdstubroot.rpl diff --git a/doc/Changelog b/doc/Changelog index cf9fef342..c4a3dd28f 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -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. diff --git a/iterator/iter_fwd.c b/iterator/iter_fwd.c index 61e69d633..488a7d3a1 100644 --- a/iterator/iter_fwd.c +++ b/iterator/iter_fwd.c @@ -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) { diff --git a/iterator/iter_fwd.h b/iterator/iter_fwd.h index 39b6ec18c..de58f5a5a 100644 --- a/iterator/iter_fwd.h +++ b/iterator/iter_fwd.h @@ -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. diff --git a/iterator/iterator.c b/iterator/iterator.c index 86c4371e4..201938832 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -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 index 000000000..e43584cbe --- /dev/null +++ b/testdata/iter_fwdstubroot.rpl @@ -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 -- 2.47.3