if (qry->ns.addr[0].ip.sa_family != AF_UNSPEC) {
uint8_t *addr = kr_nsrep_inaddr(qry->ns.addr[0]);
size_t addr_len = kr_nsrep_inaddr_len(qry->ns.addr[0]);
- knot_rdata_t rdata[knot_rdata_array_size(addr_len)];
- knot_rdata_init(rdata, addr_len, addr, 0);
- return kr_zonecut_del(&qry->zone_cut, qry->ns.name, rdata);
+ /* @warning _NOT_ thread-safe */
+ static knot_rdata_t rdata_arr[RDATA_ARR_MAX];
+ knot_rdata_init(rdata_arr, addr_len, addr, 0);
+ return kr_zonecut_del(&qry->zone_cut, qry->ns.name, rdata_arr);
} else {
return kr_zonecut_del(&qry->zone_cut, qry->ns.name, NULL);
}
/* Create empty RR */
knot_rrset_t rr;
knot_rrset_init(&rr, knot_dname_copy(name, &pkt->mm), rtype, rclass);
- /* Create RDATA */
- knot_rdata_t rdata_arr[knot_rdata_array_size(rdlen)];
+ /* Create RDATA
+ * @warning _NOT_ thread safe.
+ */
+ static knot_rdata_t rdata_arr[RDATA_ARR_MAX];
knot_rdata_init(rdata_arr, rdlen, rdata, ttl);
knot_rdataset_add(&rr.rrs, rdata_arr, &pkt->mm);
/* Append RR */
typedef array_t(knot_rrset_t *) rr_array_t;
/* @endcond */
+/** @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)))
if (!ctx || !cut) {
return kr_error(EINVAL);
}
+ /* @warning _NOT_ thread-safe */
+ static knot_rdata_t rdata_arr[RDATA_ARR_MAX];
update_cut_name(cut, U8(""));
map_walk(&cut->nsset, free_addr_set, cut->pool);
/* Copy compiled-in root hints */
for (unsigned i = 0; i < HINT_COUNT; ++i) {
const struct hint_info *hint = &SBELT[i];
- knot_rdata_t rdata[knot_rdata_array_size(hint->len)];
- knot_rdata_init(rdata, hint->len, hint->addr, 0);
- ret = kr_zonecut_add(cut, hint->name, rdata);
+ knot_rdata_init(rdata_arr, hint->len, hint->addr, 0);
+ ret = kr_zonecut_add(cut, hint->name, rdata_arr);
if (ret != 0) {
break;
}
return kr_error(EINVAL);
}
- /* Build rdata */
- size_t addr_len = 0;
- uint8_t *raw_addr = sockaddr_raw(&ss, &addr_len);
- knot_rdata_t rdata[knot_rdata_array_size(addr_len)];
- knot_rdata_init(rdata, addr_len, raw_addr, 0);
-
- return kr_zonecut_add(hints, key, rdata);
+ /* Build RDATA */
+ size_t addr_len = kr_inaddr_len((struct sockaddr *)&ss);
+ const uint8_t *raw_addr = (const uint8_t *)kr_inaddr((struct sockaddr *)&ss);
+ /* @warning _NOT_ thread-safe */
+ static knot_rdata_t rdata_arr[RDATA_ARR_MAX];
+ knot_rdata_init(rdata_arr, addr_len, raw_addr, 0);
+ return kr_zonecut_add(hints, key, rdata_arr);
}
static int load_map(struct kr_zonecut *hints, FILE *fp)