From 2fa5b27c5cb379cc8024e97e3ee63d1597ccd7c3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= <vladimir.cunat@nic.cz>
Date: Mon, 2 Jul 2018 14:47:46 +0200
Subject: [PATCH] knot_rdata_* changes

The _t isn't uint8_t* anymore but a structure with .len and .data.
---
 daemon/lua/kres-gen.lua     |  2 --
 daemon/lua/kres-gen.sh      |  2 --
 daemon/lua/kres.lua         |  2 +-
 lib/cache/api.c             | 13 ++++++-------
 lib/cache/entry_rr.c        |  4 ++--
 lib/dnssec.c                |  8 ++++----
 lib/dnssec/nsec3.c          |  4 ++--
 lib/dnssec/signature.c      | 11 +++++------
 lib/layer/iterate.c         |  8 +++-----
 lib/utils.h                 |  2 --
 lib/zonecut.c               | 12 +++++-------
 modules/priming/priming.lua |  5 +----
 tests/test.h                |  5 +++--
 13 files changed, 32 insertions(+), 46 deletions(-)

diff --git a/daemon/lua/kres-gen.lua b/daemon/lua/kres-gen.lua
index e00ecb5e2..4f271090f 100644
--- a/daemon/lua/kres-gen.lua
+++ b/daemon/lua/kres-gen.lua
@@ -254,8 +254,6 @@ _Bool knot_dname_is_sub(const knot_dname_t *, const knot_dname_t *);
 int knot_dname_labels(const uint8_t *, const uint8_t *);
 int knot_dname_size(const knot_dname_t *);
 char *knot_dname_to_str(char *, const knot_dname_t *, size_t);
-uint16_t knot_rdata_rdlen(const knot_rdata_t *);
-uint8_t *knot_rdata_data(const knot_rdata_t *);
 size_t knot_rdata_array_size(uint16_t);
 knot_rdata_t *knot_rdataset_at(const knot_rdataset_t *, size_t);
 int knot_rdataset_merge(knot_rdataset_t *, const knot_rdataset_t *, knot_mm_t *);
diff --git a/daemon/lua/kres-gen.sh b/daemon/lua/kres-gen.sh
index 2eb40b6f0..c02b28f8d 100755
--- a/daemon/lua/kres-gen.sh
+++ b/daemon/lua/kres-gen.sh
@@ -105,8 +105,6 @@ printf "\tchar _stub[];\n};\n"
 	knot_dname_size
 	knot_dname_to_str
 # Resource records
-	knot_rdata_rdlen
-	knot_rdata_data
 	knot_rdata_array_size
 	knot_rdataset_at
 	knot_rdataset_merge
diff --git a/daemon/lua/kres.lua b/daemon/lua/kres.lua
index ecf267672..16a5f4931 100644
--- a/daemon/lua/kres.lua
+++ b/daemon/lua/kres.lua
@@ -373,7 +373,7 @@ ffi.metatype( knot_rrset_t, {
 		rdata = function(rr, i)
 			assert(ffi.istype(knot_rrset_t, rr))
 			local rdata = knot.knot_rdataset_at(rr.rrs, i)
-			return ffi.string(knot.knot_rdata_data(rdata), knot.knot_rdata_rdlen(rdata))
+			return ffi.string(rdata.data, rdata.len)
 		end,
 		get = function(rr, i)
 			assert(ffi.istype(knot_rrset_t, rr))
diff --git a/lib/cache/api.c b/lib/cache/api.c
index 0fedc22c1..63fe1caf7 100644
--- a/lib/cache/api.c
+++ b/lib/cache/api.c
@@ -475,19 +475,18 @@ static ssize_t stash_rrset(struct kr_cache *cache, const struct kr_query *qry,
 		}
 
 		assert(rr->type == KNOT_RRTYPE_NSEC3);
-		const knot_rdata_t *np_data = knot_rdata_data(rr->rrs.data);
-		const int rdlen = knot_rdata_rdlen(rr->rrs.data);
-		if (rdlen <= 4) return kr_error(EILSEQ); /*< data from outside; less trust */
-		const int np_dlen = nsec_p_rdlen(np_data);
-		if (np_dlen > rdlen) return kr_error(EILSEQ);
-		key = key_NSEC3(k, encloser, nsec_p_mkHash(np_data));
+		const knot_rdata_t * const rdata = rr->rrs.data;
+		if (rdata->len <= 4) return kr_error(EILSEQ); /*< data from outside; less trust */
+		const int np_dlen = nsec_p_rdlen(rdata->data);
+		if (np_dlen > rdata->len) return kr_error(EILSEQ);
+		key = key_NSEC3(k, encloser, nsec_p_mkHash(rdata->data));
 		if (npp && !*npp) {
 			*npp = mm_alloc(&qry->request->pool, np_dlen);
 			if (!*npp) {
 				assert(!ENOMEM);
 				break;
 			}
-			memcpy(*npp, np_data, np_dlen);
+			memcpy(*npp, rdata->data, np_dlen);
 		}
 		break;
 	default:
diff --git a/lib/cache/entry_rr.c b/lib/cache/entry_rr.c
index 7d3f13b22..34c133135 100644
--- a/lib/cache/entry_rr.c
+++ b/lib/cache/entry_rr.c
@@ -34,10 +34,10 @@ int rdataset_dematerialize(const knot_rdataset_t *rds, uint8_t * restrict data)
 
 	knot_rdata_t *rd = rds ? rds->data : NULL;
 	for (int i = 0; i < rr_count; ++i, rd = kr_rdataset_next(rd)) {
-		const uint16_t len = knot_rdata_rdlen(rd);
+		const uint16_t len = rd->len;
 		memcpy(data, &len, sizeof(len));
 		data += sizeof(len);
-		memcpy(data, knot_rdata_data(rd), len);
+		memcpy(data, rd->data, len);
 		data += len;
 	}
 	//return data - data0;
diff --git a/lib/dnssec.c b/lib/dnssec.c
index 568ad63ba..14e37f681 100644
--- a/lib/dnssec.c
+++ b/lib/dnssec.c
@@ -181,7 +181,7 @@ static int kr_rrset_validate_with_key(kr_rrset_validation_ctx_t *vctx,
 	if (key == NULL) {
 		const knot_rdata_t *krr = knot_rdataset_at(&keys->rrs, key_pos);
 		int ret = kr_dnssec_key_from_rdata(&created_key, keys->owner,
-			                       knot_rdata_data(krr), knot_rdata_rdlen(krr));
+						   krr->data, krr->len);
 		if (ret != 0) {
 			vctx->result = ret;
 			return vctx->result;
@@ -292,14 +292,14 @@ int kr_dnskeys_trusted(kr_rrset_validation_ctx_t *vctx, const knot_rrset_t *ta)
 	 */
 	for (uint16_t i = 0; i < keys->rrs.rr_count; ++i) {
 		/* RFC4035 5.3.1, bullet 8 */ /* ZSK */
+		/* LATER(optim.): more efficient way to iterate than _at() */
 		const knot_rdata_t *krr = knot_rdataset_at(&keys->rrs, i);
-		const uint8_t *key_data = knot_rdata_data(krr);
-		if (!kr_dnssec_key_zsk(key_data) || kr_dnssec_key_revoked(key_data)) {
+		if (!kr_dnssec_key_zsk(krr->data) || kr_dnssec_key_revoked(krr->data)) {
 			continue;
 		}
 		
 		struct dseckey *key = NULL;
-		if (kr_dnssec_key_from_rdata(&key, keys->owner, key_data, knot_rdata_rdlen(krr)) != 0) {
+		if (kr_dnssec_key_from_rdata(&key, keys->owner, krr->data, krr->len) != 0) {
 			continue;
 		}
 		if (kr_authenticate_referral(ta, (dnssec_key_t *) key) != 0) {
diff --git a/lib/dnssec/nsec3.c b/lib/dnssec/nsec3.c
index ef0944bbb..19bc74efa 100644
--- a/lib/dnssec/nsec3.c
+++ b/lib/dnssec/nsec3.c
@@ -55,9 +55,9 @@ static int nsec3_parameters(dnssec_nsec3_params_t *params, const knot_rrset_t *n
 	const size_t SALT_OFFSET = 5; /* First 5 octets contain { Alg, Flags, Iterations, Salt length } */
 	dnssec_binary_t rdata = {
 		.size = SALT_OFFSET + (size_t) knot_nsec3_salt_length(&nsec3->rrs, 0),
-		.data = knot_rdata_data(rr),
+		.data = /*const-cast*/(uint8_t *)rr->data,
 	};
-	if (rdata.size > knot_rdata_rdlen(rr))
+	if (rdata.size > rr->len)
 		return kr_error(EMSGSIZE);
 
 	int ret = dnssec_nsec3_params_from_rdata(params, &rdata);
diff --git a/lib/dnssec/signature.c b/lib/dnssec/signature.c
index 928520f16..934792c51 100644
--- a/lib/dnssec/signature.c
+++ b/lib/dnssec/signature.c
@@ -67,14 +67,14 @@ int kr_authenticate_referral(const knot_rrset_t *ref, const dnssec_key_t *key)
 	knot_rdata_t *rd = ref->rrs.data;
 	for (uint16_t i = 0; i < ref->rrs.rr_count; ++i) {
 		dnssec_binary_t ds_rdata = {
-			.size = knot_rdata_rdlen(rd),
-			.data = knot_rdata_data(rd)
+			.size = rd->len,
+			.data = rd->data
 		};
 		ret = authenticate_ds(key, &ds_rdata, knot_ds_digest_type(&ref->rrs, i));
 		if (ret == 0) { /* Found a good DS */
 			return kr_ok();
 		}
-		rd = kr_rdataset_next(rd);
+		rd = knot_rdataset_next(rd);
 	}
 
 	return kr_error(ret);
@@ -287,10 +287,9 @@ int kr_check_signature(const knot_rrset_t *rrsigs, size_t pos,
 	}
 
 	uint32_t orig_ttl = knot_rrsig_original_ttl(&rrsigs->rrs, pos);
-	const knot_rdata_t *rr_data = knot_rdataset_at(&rrsigs->rrs, pos);
-	uint8_t *rdata = knot_rdata_data(rr_data);
+	const knot_rdata_t *rd = knot_rdataset_at(&rrsigs->rrs, pos);
 
-	if (sign_ctx_add_data(sign_ctx, rdata, covered, orig_ttl, trim_labels) != 0) {
+	if (sign_ctx_add_data(sign_ctx, rd->data, covered, orig_ttl, trim_labels) != 0) {
 		ret = kr_error(ENOMEM);
 		goto fail;
 	}
diff --git a/lib/layer/iterate.c b/lib/layer/iterate.c
index 84b728139..2c10013ac 100644
--- a/lib/layer/iterate.c
+++ b/lib/layer/iterate.c
@@ -158,19 +158,17 @@ static int update_nsaddr(const knot_rrset_t *rr, struct kr_query *query, int *gl
 {
 	if (rr->type == KNOT_RRTYPE_A || rr->type == KNOT_RRTYPE_AAAA) {
 		const knot_rdata_t *rdata = rr->rrs.data;
-		const void *addr = knot_rdata_data(rdata);
-		const int addr_len = knot_rdata_rdlen(rdata);
 		char name_str[KR_DNAME_STR_MAXLEN];
 		char addr_str[INET6_ADDRSTRLEN];
 		WITH_VERBOSE(query) {
-			const int af = (addr_len == sizeof(struct in_addr)) ?
+			const int af = (rdata->len == sizeof(struct in_addr)) ?
 				       AF_INET : AF_INET6;
 			knot_dname_to_str(name_str, rr->owner, sizeof(name_str));
 			name_str[sizeof(name_str) - 1] = 0;
-			inet_ntop(af, addr, addr_str, sizeof(addr_str));
+			inet_ntop(af, rdata->data, addr_str, sizeof(addr_str));
 		}
 		if (!(query->flags.ALLOW_LOCAL) &&
-			!is_valid_addr(addr, addr_len)) {
+			!is_valid_addr(rdata->data, rdata->len)) {
 			QVERBOSE_MSG(query, "<= ignoring invalid glue for "
 				     "'%s': '%s'\n", name_str, addr_str);
 			return KR_STATE_CONSUME; /* Ignore invalid addresses */
diff --git a/lib/utils.h b/lib/utils.h
index ba60ce464..4a222cc93 100644
--- a/lib/utils.h
+++ b/lib/utils.h
@@ -184,8 +184,6 @@ typedef array_t(ranked_rr_array_entry_t *) ranked_rr_array_t;
 
 /** @internal RDATA array maximum size. */
 #define RDATA_ARR_MAX (UINT16_MAX + sizeof(uint64_t))
-/** @internal Next RDATA shortcut. */
-#define kr_rdataset_next(rd) (rd + knot_rdata_array_size(knot_rdata_rdlen(rd)))
 
 /** Concatenate N strings. */
 KR_EXPORT
diff --git a/lib/zonecut.c b/lib/zonecut.c
index d578132ab..8ba28a9ac 100644
--- a/lib/zonecut.c
+++ b/lib/zonecut.c
@@ -184,17 +184,15 @@ int kr_zonecut_add(struct kr_zonecut *cut, const knot_dname_t *ns, const knot_rd
 		return kr_ok();
 	}
 	/* Check for duplicates */
-	uint16_t rdlen = knot_rdata_rdlen(rdata);
-	uint8_t *raw_addr = knot_rdata_data(rdata);
-	if (pack_obj_find(*pack, raw_addr, rdlen)) {
+	if (pack_obj_find(*pack, rdata->data, rdata->len)) {
 		return kr_ok();
 	}
 	/* Push new address */
-	int ret = pack_reserve_mm(**pack, 1, rdlen, kr_memreserve, cut->pool);
+	int ret = pack_reserve_mm(**pack, 1, rdata->len, kr_memreserve, cut->pool);
 	if (ret != 0) {
 		return kr_error(ENOMEM);
 	}
-	return pack_obj_push(*pack, raw_addr, rdlen);
+	return pack_obj_push(*pack, rdata->data, rdata->len);
 }
 
 int kr_zonecut_del(struct kr_zonecut *cut, const knot_dname_t *ns, const knot_rdata_t *rdata)
@@ -211,7 +209,7 @@ int kr_zonecut_del(struct kr_zonecut *cut, const knot_dname_t *ns, const knot_rd
 	}
 	/* Remove address from the pack. */
 	if (rdata) {
-		ret = pack_obj_del(pack, knot_rdata_data(rdata), knot_rdata_rdlen(rdata));
+		ret = pack_obj_del(pack, rdata->data, rdata->len);
 	}
 	/* No servers left, remove NS from the set. */
 	if (pack->len == 0) {
@@ -306,7 +304,7 @@ static void fetch_addr(struct kr_zonecut *cut, struct kr_cache *cache,
 	knot_rdata_t *rd = cached_rr.rrs.data;
 	for (uint16_t i = 0; i < cached_rr.rrs.rr_count; ++i) {
 		(void) kr_zonecut_add(cut, ns, rd);
-		rd = kr_rdataset_next(rd);
+		rd = knot_rdataset_next(rd);
 	}
 }
 
diff --git a/modules/priming/priming.lua b/modules/priming/priming.lua
index 6f05d7fdb..917f201f3 100644
--- a/modules/priming/priming.lua
+++ b/modules/priming/priming.lua
@@ -1,6 +1,5 @@
 -- Module interface
 local ffi = require('ffi')
-local knot = ffi.load(libknot_SONAME)
 
 local priming = {}
 priming.retry_time = 10 * sec -- retry time when priming fail
@@ -51,9 +50,7 @@ local function address_callback(pkt, req)
 			local rr = section[i]
 			if rr.type == kres.type.A or rr.type == kres.type.AAAA then
 				for k = 0, rr.rrs.rr_count-1 do
-					local rdata = knot.knot_rdataset_at(rr.rrs, k)
-					rdata = ffi.string(rdata, knot.knot_rdata_array_size(knot.knot_rdata_rdlen(rdata)))
-					table.insert(internal.nsset[rr:owner()], rdata)
+					table.insert(internal.nsset[rr:owner()], rr.rrs:rdata(k))
 				end
 			end
 		end
diff --git a/tests/test.h b/tests/test.h
index 8f06db568..5526cfd8e 100644
--- a/tests/test.h
+++ b/tests/test.h
@@ -99,6 +99,7 @@ static inline void test_random_rr(knot_rrset_t *rr, uint32_t ttl)
 {
 	static uint8_t owner_buf[KNOT_DNAME_MAXLEN];
 	static uint8_t rdata_buf[65535];
+	knot_rdata_t *rdata = (knot_rdata_t *)rdata_buf;
 
 	uint16_t num = rand() % (sizeof(owner_buf) - 2);
 	uint8_t tmp_buf[KNOT_DNAME_MAXLEN];
@@ -112,11 +113,11 @@ static inline void test_random_rr(knot_rrset_t *rr, uint32_t ttl)
 	/* Create payload */
 	tmp_buf[0] = num;
 	test_randstr((char *)(tmp_buf + 1), tmp_buf[0] + 1);
-	knot_rdata_init(rdata_buf, num + 1, tmp_buf);
+	knot_rdata_init(rdata, num + 1, tmp_buf);
 
 	/* Assign static buffers. */
 	knot_rrset_init(rr, owner_buf, KNOT_RRTYPE_TXT, KNOT_CLASS_IN, ttl);
 	rr->rrs.rr_count = 1;
-	rr->rrs.data = rdata_buf;
+	rr->rrs.data = rdata;
 }
 
-- 
GitLab