]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
selection: readd CNAME error handling
authorŠtěpán Balážik <stepan.balazik@nic.cz>
Mon, 12 Oct 2020 08:45:38 +0000 (10:45 +0200)
committerŠtěpán Balážik <stepan.balazik@nic.cz>
Thu, 15 Oct 2020 11:22:22 +0000 (13:22 +0200)
lib/layer/iterate.c
lib/resolve.c
lib/selection.h
tests/integration/deckard

index 6f6c975d711571c3ac1aa712c4f6489142a31389..338a9c40648b77e685e72a4fdfa8bcf8851110dd 100644 (file)
@@ -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;
                        }
                }
index d8f2c7eb33ed334c8b21a8e9d80001598e61c5e4..1cfe4d374d0af74bf2c1a15561f4c59069ff93d5 100644 (file)
@@ -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 */
index df05eab6d694cbe87083493c4b6a83399aa074c5..c16cc15e715b491f2a7d54bcc085aa5b72e4caff 100644 (file)
@@ -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 {
index 6168c4f31eea1193c202cbb14fe7c34002b53765..4df86d9cbec25588cec454d7246a3ee5227ad65d 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 6168c4f31eea1193c202cbb14fe7c34002b53765
+Subproject commit 4df86d9cbec25588cec454d7246a3ee5227ad65d