diff --git a/src/zcompile/zcompile.c b/src/zcompile/zcompile.c
index 40ba583a1fe98bf84e3975cb8aba94b556390c5d..7b20a6b8fdd9be68cd4807700d8dd538cfa0a01d 100644
--- a/src/zcompile/zcompile.c
+++ b/src/zcompile/zcompile.c
@@ -275,9 +275,14 @@ static int add_rdata_to_rr(knot_rrset_t *rrset, const scanner_t *scanner)
 	dbg_zp_detail("zp: add_rdata_to_rr: Adding type %d, RRSet has %d RRs.\n",
 	              rrset->type, rrset->rdata_count);
 	
-	uint8_t *rdata = malloc(calculate_item_size(rrset, scanner));
-	assert(rdata);
+	size_t rdlen = calculate_item_size(rrset, scanner);
 	size_t offset = 0;
+	uint8_t *rdata = knot_rrset_create_rdata(rrset, rdlen);
+	if (rdata == NULL) {
+		dbg_zp("zp: create_rdata: Could not create RR. Reason: %s.\n",
+		       knot_strerror(ret));
+		return KNOT_ENOMEM;
+	}
 	
 	for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; i++) {
 		int item = desc->block_types[i];
@@ -326,16 +331,6 @@ dbg_zp_exec_detail(
 		}
 	}
 	
-	int ret = knot_rrset_add_rdata(rrset, rdata, offset);
-	if (ret != KNOT_EOK) {
-		dbg_zp("zp: add_rdat_to_rr: Could not add RR. Reason: %s.\n",
-		       knot_strerror(ret));
-		return ret;
-	}
-	
-	/* RDATA are safely added to RRSet now. */
-	free(rdata);
-	
 	return KNOT_EOK;
 }