From a32f127c0c6d75f8b6198e030623d3ab5e734a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Vavru=C5=A1a?= <marek.vavrusa@nic.cz> Date: Tue, 17 Feb 2015 00:48:19 +0100 Subject: [PATCH] lib/resolve: never backtrace from enclosing zone cut --- lib/layer/itercache.c | 1 - lib/resolve.c | 17 +++++++++++------ tests/testdata/iter_minim_ns.rpl | 3 +-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/layer/itercache.c b/lib/layer/itercache.c index a35a80791..0b0e501fe 100644 --- a/lib/layer/itercache.c +++ b/lib/layer/itercache.c @@ -247,7 +247,6 @@ static int write_cache(knot_layer_t *ctx, knot_pkt_t *pkt) /* Cache only positive answers. */ /*! \todo Negative answers cache support */ if (knot_wire_get_rcode(pkt->wire) != KNOT_RCODE_NOERROR) { - DEBUG_MSG("write NCACHE (NOTIMPL)\n"); return ctx->state; } diff --git a/lib/resolve.c b/lib/resolve.c index b58cb7884..341f46a40 100755 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -65,17 +65,17 @@ static int invalidate_ns(struct kr_rplan *rplan, struct kr_query *qry) knot_rdataset_clear(&to_remove, rplan->pool); /* Remove record(s) */ + int ret = KNOT_EOK; if (cached.rrs.rr_count == 0) { (void) kr_cache_remove(txn, &cached); - kr_find_zone_cut(&qry->zone_cut, qry->sname, txn, qry->timestamp.tv_sec); + ret = KNOT_ENOENT; } else { (void) kr_cache_insert(txn, &cached, qry->timestamp.tv_sec); kr_set_zone_cut(&qry->zone_cut, cached.owner, knot_ns_name(&cached.rrs, 0)); } - knot_rrset_clear(&cached, rplan->pool); - /* Update zone cut and continue. */ - return KNOT_EOK; + knot_rrset_clear(&cached, rplan->pool); + return ret; } static int iterate(struct knot_requestor *requestor, struct kr_layer_param *param) @@ -123,8 +123,13 @@ static int iterate(struct knot_requestor *requestor, struct kr_layer_param *para } /* Resolution failed, invalidate current NS and reset to UDP. */ DEBUG_MSG("=> resolution failed: '%s', invalidating\n", knot_strerror(ret)); - ret = invalidate_ns(rplan, cur); - cur->flags &= ~QUERY_TCP; + if (invalidate_ns(rplan, cur) == KNOT_EOK) { + cur->flags &= ~QUERY_TCP; + } else { + DEBUG_MSG("=> no ns left to ask\n"); + kr_rplan_pop(rplan, cur); + } + return KNOT_EOK; } /* Pop query if resolved. */ diff --git a/tests/testdata/iter_minim_ns.rpl b/tests/testdata/iter_minim_ns.rpl index da704dd4c..02709db19 100644 --- a/tests/testdata/iter_minim_ns.rpl +++ b/tests/testdata/iter_minim_ns.rpl @@ -64,7 +64,6 @@ com. IN NS lame-addr.gtld-servers.net. com. IN NS a.gtld-servers.net. SECTION ADDITIONAL lame-addr.gtld-servers.net. IN A 1.1.1.1 -a.gtld-servers.net. IN A 1.1.1.1 a.gtld-servers.net. IN A 192.5.6.30 ENTRY_END RANGE_END @@ -92,7 +91,7 @@ ENTRY_END ENTRY_BEGIN MATCH opcode qtype qname ADJUST copy_id -REPLY QR NOERROR +REPLY QR AA NOERROR SECTION QUESTION www.example.com. IN NS SECTION ANSWER -- GitLab