Commit 349be007e6 for bind

commit 349be007e69619e9d225ddd58b9e6ce7f8476cce
Author: Alessio Podda <alessio@isc.org>
Date:   Tue Aug 25 03:15:59 2026 +0200

    Store rdatavec length in the header

    We can further simplify the code by storing the raw length in the
    header.

diff --git a/lib/dns/include/dns/rdatavec.h b/lib/dns/include/dns/rdatavec.h
index 5cf3566114..a99adba10c 100644
--- a/lib/dns/include/dns/rdatavec.h
+++ b/lib/dns/include/dns/rdatavec.h
@@ -82,7 +82,8 @@ struct dns_vecheader {
 	_Atomic(dns_trust_t) trust;

 	dns_typepair_t typepair;
-	uint16_t count;
+	uint16_t       count;
+	uint32_t       raw_length;

 	isc_refcount_t references;

diff --git a/lib/dns/rdatavec.c b/lib/dns/rdatavec.c
index faf7f9f92f..7f41725e12 100644
--- a/lib/dns/rdatavec.c
+++ b/lib/dns/rdatavec.c
@@ -94,11 +94,13 @@ compare_rdata(const void *p1, const void *p2) {

 static unsigned char *
 newvec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
-       size_t size, uint16_t count) {
+       uint16_t count, uint32_t raw_length) {
+	size_t size = sizeof(dns_vecheader_t) + raw_length;
 	dns_vecheader_t *header = isc_mem_get(mctx, size);

 	*header = (dns_vecheader_t){
 		.count = count,
+		.raw_length = raw_length,
 		.next_header = ISC_SLINK_INITIALIZER,
 		.typepair = DNS_TYPEPAIR_VALUE(rdataset->type,
 					       rdataset->covers),
@@ -135,12 +137,10 @@ makevec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
 	 */
 	if (rdataset->methods == &dns_rdatavec_rdatasetmethods) {
 		dns_vecheader_t *header = dns_vecheader_getheader(rdataset);
-		buflen = dns_rdatavec_size(header);

-		rawbuf = newvec(rdataset, mctx, region, buflen, header->count);
-
-		INSIST(headerlen <= buflen);
-		memmove(rawbuf, header->raw, buflen - headerlen);
+		rawbuf = newvec(rdataset, mctx, region, header->count,
+				header->raw_length);
+		memmove(rawbuf, header->raw, header->raw_length);
 		return ISC_R_SUCCESS;
 	}

@@ -153,7 +153,7 @@ makevec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
 		if (rdataset->type != 0) {
 			return ISC_R_FAILURE;
 		}
-		(void)newvec(rdataset, mctx, region, buflen, 0);
+		(void)newvec(rdataset, mctx, region, 0, 0);
 		return ISC_R_SUCCESS;
 	}

@@ -247,7 +247,7 @@ makevec(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
 	 * Allocate the memory, set up a buffer, start copying in
 	 * data.
 	 */
-	rawbuf = newvec(rdataset, mctx, region, buflen, nitems);
+	rawbuf = newvec(rdataset, mctx, region, nitems, buflen - headerlen);

 	for (i = 0; i < nitems; i++) {
 		length = rdata[i].length;
@@ -300,15 +300,7 @@ unsigned int
 dns_rdatavec_size(dns_vecheader_t *header) {
 	REQUIRE(header != NULL);

-	unsigned char *current = header->raw;
-	uint16_t count = header->count;
-
-	while (count-- > 0) {
-		uint16_t length = get_uint16(current);
-		current += length;
-	}
-
-	return (unsigned int)(current - (unsigned char *)header);
+	return sizeof(*header) + header->raw_length;
 }

 unsigned int
@@ -488,6 +480,7 @@ dns_rdatavec_merge(dns_vecheader_t *oheader, dns_vecheader_t *nheader,
 	}
 	*theader = (dns_vecheader_t){
 		.count = tcount,
+		.raw_length = rlength,
 		.typepair = nheader->typepair,
 		.mctx = isc_mem_ref(mctx),
 		.serial = nheader->serial,
@@ -583,6 +576,7 @@ dns_rdatavec_subtract(dns_vecheader_t *oheader, dns_vecheader_t *sheader,
 	uint16_t attrs = RESIGN(oheader) ? DNS_VECHEADERATTR_RESIGN : 0;
 	*theader = (dns_vecheader_t){
 		.count = tcount,
+		.raw_length = rlength,
 		.typepair = oheader->typepair,
 		.mctx = isc_mem_ref(mctx),
 		.serial = oheader->serial,