From 5a7068ba39ea1958e7ef8597dedacd55f64ca67d Mon Sep 17 00:00:00 2001
From: Daniel Salzman <daniel.salzman@nic.cz>
Date: Mon, 13 Feb 2017 15:42:32 +0100
Subject: [PATCH] chaos: code cleanup

---
 src/knot/nameserver/chaos.c | 88 ++++++++++++++-----------------------
 1 file changed, 34 insertions(+), 54 deletions(-)

diff --git a/src/knot/nameserver/chaos.c b/src/knot/nameserver/chaos.c
index ce8d7d5856..f097d49b36 100644
--- a/src/knot/nameserver/chaos.c
+++ b/src/knot/nameserver/chaos.c
@@ -20,7 +20,6 @@
 #include "knot/nameserver/chaos.h"
 #include "knot/conf/conf.h"
 #include "libknot/libknot.h"
-#include "dnssec/lib/dnssec/random.h"
 
 #define WISH "Knot DNS developers wish you "
 #define HOPE "Knot DNS developers hope you "
@@ -40,74 +39,61 @@ static const char *wishes[] = {
 	HOPE "won't find surprising news in today's journal.",
 	HOPE "perform rollover often just when playing roulette.",
 	HOPE "get notified before your domain registration expires.",
-	/*! \todo add more */
 };
 
 #undef WISH
 #undef HOPE
 
-/*!
- * \brief Get a string result for a given TXT query.
- */
-static const char *get_txt_response_string(const knot_dname_t *qname)
+static const char *get_txt_response_string(knot_pkt_t *response)
 {
-	char *qname_str = knot_dname_to_str_alloc(qname);
-	const char *response = NULL;
+	char qname[32];
+	if (knot_dname_to_str(qname, knot_pkt_qname(response), sizeof(qname)) == NULL) {
+		return NULL;
+	}
 
-	/* id.server and hostname.bind should have similar meaning. */
-	if (strcasecmp("id.server.",     qname_str) == 0 ||
-	    strcasecmp("hostname.bind.", qname_str) == 0) {
+	const char *response_str = NULL;
+
+	/* Allow hostname.bind. for compatibility. */
+	if (strcasecmp("id.server.",     qname) == 0 ||
+	    strcasecmp("hostname.bind.", qname) == 0) {
 		conf_val_t val = conf_get(conf(), C_SRV, C_IDENT);
-		response = conf_str(&val);
-		/* No item means auto. */
-		if (val.code != KNOT_EOK) {
-			response = conf()->hostname;
+		if (val.code == KNOT_EOK) {
+			response_str = conf_str(&val); // Can be NULL!
+		} else {
+			response_str = conf()->hostname;
 		}
-	/* Allow both version version.{server, bind}. for compatibility. */
-	} else if (strcasecmp("version.server.", qname_str) == 0 ||
-	           strcasecmp("version.bind.",   qname_str) == 0) {
+	/* Allow version.bind. for compatibility. */
+	} else if (strcasecmp("version.server.", qname) == 0 ||
+	           strcasecmp("version.bind.",   qname) == 0) {
 		conf_val_t val = conf_get(conf(), C_SRV, C_VERSION);
-		response = conf_str(&val);
-		/* No item means auto. */
-		if (val.code != KNOT_EOK) {
-			response = "Knot DNS " PACKAGE_VERSION;
+		if (val.code == KNOT_EOK) {
+			response_str = conf_str(&val); // Can be NULL!
+		} else {
+			response_str = "Knot DNS " PACKAGE_VERSION;
 		}
-	} else if (strcasecmp("fortune.", qname_str) == 0) {
+	} else if (strcasecmp("fortune.", qname) == 0) {
 		conf_val_t val = conf_get(conf(), C_SRV, C_VERSION);
-		/* No item means auto. */
 		if (val.code != KNOT_EOK) {
-			uint16_t wishno = dnssec_random_uint16_t() %
+			uint16_t wishno = knot_wire_get_id(response->wire) %
 			                  (sizeof(wishes) / sizeof(wishes[0]));
-			response = wishes[wishno];
+			response_str = wishes[wishno];
 		}
 	}
 
-	free(qname_str);
-
-	return response;
+	return response_str;
 }
 
-/*!
- * \brief Create TXT RR with a given string content.
- *
- * \param owner     RR owner name.
- * \param response  String to be saved in RDATA. Truncated to 255 chars.
- * \param mm        Memory context.
- * \param rrset     Store here.
- *
- * \return KNOT_EOK
- */
 static int create_txt_rrset(knot_rrset_t *rrset, const knot_dname_t *owner,
-                            const char *response, knot_mm_t *mm)
+                            const char *response_str, knot_mm_t *mm)
 {
 	/* Truncate response to one TXT label. */
-	size_t response_len = strlen(response);
-	if (response_len > KNOT_DNAME_MAXLEN) {
-		response_len = KNOT_DNAME_MAXLEN;
+	size_t response_len = strlen(response_str);
+	if (response_len > UINT8_MAX) {
+		response_len = UINT8_MAX;
 	}
 
 	knot_dname_t *rowner = knot_dname_copy(owner, mm);
-	if (!rowner) {
+	if (rowner == NULL) {
 		return KNOT_ENOMEM;
 	}
 
@@ -115,7 +101,7 @@ static int create_txt_rrset(knot_rrset_t *rrset, const knot_dname_t *owner,
 	uint8_t rdata[response_len + 1];
 
 	rdata[0] = response_len;
-	memcpy(&rdata[1], response, response_len);
+	memcpy(&rdata[1], response_str, response_len);
 
 	int ret = knot_rrset_add_rdata(rrset, rdata, response_len + 1, 0, mm);
 	if (ret != KNOT_EOK) {
@@ -126,22 +112,16 @@ static int create_txt_rrset(knot_rrset_t *rrset, const knot_dname_t *owner,
 	return KNOT_EOK;
 }
 
-/*!
- * \brief Create a response for a TXT CHAOS query.
- *
- * \param return KNOT_RCODE_NOERROR if the response was successfully created,
- *               otherwise an RCODE representing the failure.
- */
 static int answer_txt(knot_pkt_t *response)
 {
-	const knot_dname_t *qname = knot_pkt_qname(response);
-	const char *response_str = get_txt_response_string(qname);
+	const char *response_str = get_txt_response_string(response);
 	if (response_str == NULL || response_str[0] == '\0') {
 		return KNOT_RCODE_REFUSED;
 	}
 
 	knot_rrset_t rrset;
-	int ret = create_txt_rrset(&rrset, qname, response_str, &response->mm);
+	int ret = create_txt_rrset(&rrset, knot_pkt_qname(response),
+	                           response_str, &response->mm);
 	if (ret != KNOT_EOK) {
 		return KNOT_RCODE_SERVFAIL;
 	}
-- 
GitLab