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