]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/resolve: special processing for deferred answers
authorGrigorii Demidov <grigorii.demidov@nic.cz>
Mon, 22 May 2017 11:58:29 +0000 (13:58 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 1 Jun 2017 14:27:16 +0000 (16:27 +0200)
lib/layer/validate.c
lib/resolve.c
lib/utils.c

index b96334c9fae29aca59e356edef7ecf689d738111..a6e409613f577e5c3d54b3ffb62568fcd65d83ba 100644 (file)
@@ -402,7 +402,9 @@ static const knot_dname_t *find_first_signer(ranked_rr_array_t *arr)
        for (size_t i = 0; i < arr->len; ++i) {
                ranked_rr_array_entry_t *entry = arr->at[i];
                const knot_rrset_t *rr = entry->rr;
-               if (entry->yielded || !kr_rank_test(entry->rank, KR_RANK_INITIAL)) {
+               if (entry->yielded ||
+                   (!kr_rank_test(entry->rank, KR_RANK_INITIAL) &&
+                   !kr_rank_test(entry->rank, KR_RANK_MISMATCH))) {
                        continue;
                }
                if (rr->type == KNOT_RRTYPE_RRSIG) {
index 32d06161fcfdae817c357e0205672d37098064bc..21c50a76b243f848a41fece05144da5a07aa71b1 100644 (file)
@@ -940,9 +940,9 @@ static int forward_trust_chain_check(struct kr_request *request, struct kr_query
                return KR_STATE_PRODUCE;
        }
 
-       const knot_dname_t *wanted_name = NULL;
+       const knot_dname_t *wanted_name = qry->sname;
        const knot_dname_t *start_name = qry->sname;
-       if (qry->flags & QUERY_AWAIT_CUT) {
+       if ((qry->flags & QUERY_AWAIT_CUT) && !resume) {
                const knot_dname_t *longest_ta = kr_ta_get_longest_name(trust_anchors, qry->sname);
                if (longest_ta) {
                        start_name = longest_ta;
@@ -963,7 +963,9 @@ static int forward_trust_chain_check(struct kr_request *request, struct kr_query
                ns_req = false;
                minimized = false;
 
-               if (qry->parent == NULL) {
+               if (resume) {
+                       wanted_name = qry->zone_cut.name;
+               } else if (qry->parent == NULL) {
                        int cut_labels = knot_dname_labels(qry->zone_cut.name, NULL);
                        int wanted_name_labels = knot_dname_labels(wanted_name, NULL);
                        while (wanted_name[0] && wanted_name_labels > cut_labels + name_offset) {
@@ -991,7 +993,7 @@ static int forward_trust_chain_check(struct kr_request *request, struct kr_query
                }
 
                if (qry->parent == NULL &&
-                   ds_req && !ns_req && minimized) {
+                   ds_req && !ns_req && (minimized || resume)) {
                        struct kr_query *next = kr_rplan_push(rplan, qry, wanted_name,
                                                              qry->sclass, KNOT_RRTYPE_NS);
                        if (!next) {
@@ -1018,7 +1020,7 @@ static int forward_trust_chain_check(struct kr_request *request, struct kr_query
                        nods = ds_req;
                }
                name_offset += 1;
-       } while (ds_req && ns_req);
+       } while (ds_req && ns_req && !resume);
 
        /* Disable DNSSEC if it enters NTA. */
        if (kr_ta_get(negative_anchors, wanted_name)){
index 5283b13f25c2dd0be3f7c1c6d071cc2dc23040ad..854ec396af68dbd4946c903c5637472cde7e9e08 100644 (file)
@@ -757,14 +757,14 @@ void kr_pkt_print(knot_pkt_t *pkt)
 
 void kr_dname_print(const knot_dname_t *name, const char *prefix, const char *postfix)
 {
-       char str[KNOT_DNAME_MAXLEN];
+       char str[KNOT_DNAME_MAXLEN] = {0};
        knot_dname_to_str(str, name, KNOT_DNAME_MAXLEN);
        kr_log_verbose ("%s%s%s", prefix, str, postfix);
 }
 
 void kr_rrtype_print(const uint16_t rrtype, const char *prefix, const char *postfix)
 {
-       char str[32];
+       char str[32] = {0};
        knot_rrtype_to_string(rrtype, str, 32);
        kr_log_verbose ("%s%s%s", prefix, str, postfix);
 }