From 60b8b3dd51d00b64a5719dbba942629e065b5631 Mon Sep 17 00:00:00 2001
From: Grigorii Demidov <grigorii.demidov@nic.cz>
Date: Tue, 13 Jun 2017 11:42:08 +0200
Subject: [PATCH] lib/resolve: special processing for cname'ed DS answers in
 forward mode (*.vutbr.cz DS)

---
 lib/resolve.c | 11 ++++++++---
 lib/utils.c   | 13 +++++++++++--
 lib/utils.h   |  3 +++
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/lib/resolve.c b/lib/resolve.c
index 014f1cead..6902cbeb9 100644
--- a/lib/resolve.c
+++ b/lib/resolve.c
@@ -1288,9 +1288,14 @@ int kr_resolve_produce(struct kr_request *request, struct sockaddr **dst, int *t
 	struct kr_query *qry = array_tail(rplan->pending);
 	if (qry->deferred != NULL) {
 		/* @todo: Refactoring validator, check trust chain before resuming. */
-		int state = (qry->flags & QUERY_FORWARD) ?
-			    forward_trust_chain_check(request, qry, true) :
-			    trust_chain_check(request, qry);
+		int state = 0;
+		if (((qry->flags & QUERY_FORWARD) == 0) ||
+		    ((qry->stype == KNOT_RRTYPE_DS) && (qry->flags & QUERY_CNAME))) {
+			state = trust_chain_check(request, qry);
+		} else {
+			state = forward_trust_chain_check(request, qry, true);
+		}
+
 		switch(state) {
 		case KR_STATE_FAIL: return KR_STATE_FAIL;
 		case KR_STATE_DONE: return KR_STATE_PRODUCE;
diff --git a/lib/utils.c b/lib/utils.c
index 854ec396a..71f1c8488 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -759,13 +759,22 @@ void kr_dname_print(const knot_dname_t *name, const char *prefix, const char *po
 {
 	char str[KNOT_DNAME_MAXLEN] = {0};
 	knot_dname_to_str(str, name, KNOT_DNAME_MAXLEN);
-	kr_log_verbose ("%s%s%s", prefix, str, postfix);
+	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] = {0};
 	knot_rrtype_to_string(rrtype, str, 32);
-	kr_log_verbose ("%s%s%s", prefix, str, postfix);
+	kr_log_verbose("%s%s%s", prefix, str, postfix);
+}
+
+void kr_qry_print(const struct kr_query *qry, const char *prefix, const char *postfix)
+{
+	char str[6] = {0};
+	knot_rrclass_to_string(qry->sclass, str, sizeof(str));
+	kr_dname_print(qry->sname, prefix, " ");
+	kr_log_verbose("%s",str);
+	kr_rrtype_print(qry->stype, " ", postfix);
 }
 
diff --git a/lib/utils.h b/lib/utils.h
index 156e8982b..25ab00e27 100644
--- a/lib/utils.h
+++ b/lib/utils.h
@@ -30,6 +30,8 @@
 #include "lib/generic/array.h"
 #include "lib/defines.h"
 
+struct kr_query;
+
 /*
  * Logging and debugging.
  */
@@ -255,6 +257,7 @@ int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire,
 			       uint32_t qry_uid, bool check_dups);
 
 void kr_rrset_print(const knot_rrset_t *rr, const char *prefix);
+void kr_qry_print(const struct kr_query *qry, const char *prefix, const char *postfix);
 void kr_pkt_print(knot_pkt_t *pkt);
 void kr_dname_print(const knot_dname_t *name, const char *prefix, const char *postfix);
 void kr_rrtype_print(const uint16_t rrtype, const char *prefix, const char *postfix);
-- 
GitLab