Commit 7433bc1250 for bind
commit 7433bc1250f8ca9d8c1f5433e589f31868a4fd2b
Author: Alessio Podda <alessio@isc.org>
Date: Mon Aug 24 16:54:21 2026 +0200
Simplify makevec deduplication
Further simplification of the makevec logic.
diff --git a/lib/dns/rdatavec.c b/lib/dns/rdatavec.c
index 838b866915..faf7f9f92f 100644
--- a/lib/dns/rdatavec.c
+++ b/lib/dns/rdatavec.c
@@ -117,11 +117,6 @@ newvec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
static isc_result_t
makevec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
uint32_t maxrrperset) {
- /*
- * Use &removed as a sentinel pointer for duplicate
- * rdata as rdata.data == NULL is valid.
- */
- static unsigned char removed;
dns_rdata_t *rdata = NULL;
unsigned char *rawbuf = NULL;
unsigned int headerlen = sizeof(dns_vecheader_t);
@@ -189,7 +184,6 @@ makevec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
INSIST(result == ISC_R_SUCCESS);
dns_rdata_init(&rdata[i]);
dns_rdataset_current(rdataset, &rdata[i]);
- INSIST(rdata[i].data != &removed);
result = dns_rdataset_next(rdataset);
}
if (i != nalloc || result != ISC_R_NOMORE) {
@@ -209,6 +203,7 @@ makevec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
if (nalloc > 1U) {
qsort(rdata, nalloc, sizeof(rdata[0]), compare_rdata);
}
+ nitems = 0;
/*
* Remove duplicates and compute the total storage required.
@@ -218,39 +213,22 @@ makevec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
* just the rdata, so our overhead is 2 bytes for the length of each
* rdata, plus the rdata itself.
*/
- for (i = 1; i < nalloc; i++) {
- if (compare_rdata(&rdata[i - 1], &rdata[i]) == 0) {
- rdata[i - 1].data = &removed;
- nitems--;
- } else {
- buflen += 2 + rdata[i - 1].length;
- /*
- * Provide space to store the per RR meta data.
- */
- if (rdataset->type == dns_rdatatype_rrsig) {
- buflen++;
- }
- if (buflen - headerlen > DNS_RDATA_MAXLENGTH) {
- result = ISC_R_NOSPACE;
- goto free_rdatas;
- }
+ for (i = 0; i < nalloc; i++) {
+ bool duplicate = i + 1 < nalloc &&
+ compare_rdata(&rdata[i], &rdata[i + 1]) == 0;
+
+ if (duplicate) {
+ continue;
}
- }
- /*
- * Don't forget the last item!
- */
- buflen += 2 + rdata[i - 1].length;
+ buflen += sizeof(uint16_t) + rdata[i].length +
+ (rdataset->type == dns_rdatatype_rrsig);
+ if (buflen - headerlen > DNS_RDATA_MAXLENGTH) {
+ result = ISC_R_NOSPACE;
+ goto free_rdatas;
+ }
- /*
- * Provide space to store the per RR meta data.
- */
- if (rdataset->type == dns_rdatatype_rrsig) {
- buflen++;
- }
- if (buflen - headerlen > DNS_RDATA_MAXLENGTH) {
- result = ISC_R_NOSPACE;
- goto free_rdatas;
+ rdata[nitems++] = rdata[i];
}
/*
@@ -271,10 +249,7 @@ makevec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
*/
rawbuf = newvec(rdataset, mctx, region, buflen, nitems);
- for (i = 0; i < nalloc; i++) {
- if (rdata[i].data == &removed) {
- continue;
- }
+ for (i = 0; i < nitems; i++) {
length = rdata[i].length;
if (rdataset->type == dns_rdatatype_rrsig) {
length++;