From 8f810eafcf03364ad3a0b85e4d47ea9eca2b4ca6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=A0t=C4=9Bp=C3=A1n=20Bal=C3=A1=C5=BEik?= Date: Mon, 12 Oct 2020 10:45:38 +0200 Subject: [PATCH] selection: readd CNAME error handling --- lib/layer/iterate.c | 5 ++++- lib/resolve.c | 4 ++++ lib/selection.h | 4 +++- tests/integration/deckard | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/layer/iterate.c b/lib/layer/iterate.c index 6f6c975d7..338a9c406 100644 --- a/lib/layer/iterate.c +++ b/lib/layer/iterate.c @@ -626,10 +626,11 @@ static int process_referral_answer(knot_pkt_t *pkt, struct kr_request *req) { const knot_dname_t *cname = NULL; int state = unroll_cname(pkt, req, true, &cname); + struct kr_query *query = req->current_query; if (state != kr_ok()) { + query->server_selection.error(query, req->upstream.transport, KR_SELECTION_BAD_CNAME); return KR_STATE_FAIL; } - struct kr_query *query = req->current_query; if (!(query->flags.CACHED)) { /* If not cached (i.e. got from upstream) * make sure that this is not an authoritative answer @@ -726,6 +727,7 @@ static int process_answer(knot_pkt_t *pkt, struct kr_request *req) /* Process answer type */ int state = unroll_cname(pkt, req, false, &cname); if (state != kr_ok()) { + query->server_selection.error(query, req->upstream.transport, KR_SELECTION_BAD_CNAME); return state; } /* Make sure that this is an authoritative answer (even with AA=0) for other layers */ @@ -756,6 +758,7 @@ static int process_answer(knot_pkt_t *pkt, struct kr_request *req) q->stype == query->stype && knot_dname_is_equal(q->sname, cname)) { VERBOSE_MSG("<= cname chain loop\n"); + query->server_selection.error(query, req->upstream.transport, KR_SELECTION_BAD_CNAME); return KR_STATE_FAIL; } } diff --git a/lib/resolve.c b/lib/resolve.c index d8f2c7eb3..1cfe4d374 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -785,6 +785,10 @@ int kr_resolve_consume(struct kr_request *request, struct kr_transport **transpo } } + if (request->state & KR_STATE_FAIL) { + qry->flags.RESOLVED = false; + } + /* Pop query if resolved. */ if (request->state == KR_STATE_YIELD) { return KR_STATE_PRODUCE; /* Requery */ diff --git a/lib/selection.h b/lib/selection.h index df05eab6d..c16cc15e7 100644 --- a/lib/selection.h +++ b/lib/selection.h @@ -28,11 +28,12 @@ enum kr_selection_error { KR_SELECTION_FORMERROR, KR_SELECTION_NOTIMPL, KR_SELECTION_OTHER_RCODE, - KR_SELECTION_TRUNCATED, // DNS errors + KR_SELECTION_TRUNCATED, KR_SELECTION_DNSSEC_ERROR, KR_SELECTION_LAME_DELEGATION, + KR_SELECTION_BAD_CNAME, /**< Too long chain, or cycle. */ KR_SELECTION_NUMBER_OF_ERRORS /**< Leave this last, as it is used as array size. */ }; @@ -50,6 +51,7 @@ static const bool UNRECOVERABLE_ERRORS[] = { [KR_SELECTION_TRUNCATED] = false, [KR_SELECTION_DNSSEC_ERROR] = true, [KR_SELECTION_LAME_DELEGATION] = true, + [KR_SELECTION_BAD_CNAME] = true, }; enum kr_transport_protocol { diff --git a/tests/integration/deckard b/tests/integration/deckard index 6168c4f31..4df86d9cb 160000 --- a/tests/integration/deckard +++ b/tests/integration/deckard @@ -1 +1 @@ -Subproject commit 6168c4f31eea1193c202cbb14fe7c34002b53765 +Subproject commit 4df86d9cbec25588cec454d7246a3ee5227ad65d -- 2.47.2