Commit 05240cb6dc for bind
commit 05240cb6dc45b8e08f218cc1cb10cc6e33fc06bc
Author: OndÅ™ej Surý <ondrej@isc.org>
Date: Tue Sep 22 10:59:55 2026 +0200
Annotate the remaining flexible array members with counted_by
Each of these structs already stores the element count of its trailing
array in a member that is set before the array is first touched, so the
attribute costs nothing and lets _FORTIFY_SOURCE and the bounds
sanitizer check accesses that are otherwise invisible to them.
Assisted-by: Claude:claude-opus-5
diff --git a/lib/dns/qp_p.h b/lib/dns/qp_p.h
index 0378ce2ef8..6d8e28050d 100644
--- a/lib/dns/qp_p.h
+++ b/lib/dns/qp_p.h
@@ -19,6 +19,7 @@
#pragma once
+#include <isc/attributes.h>
#include <isc/bit.h>
#include <isc/refcount.h>
@@ -336,7 +337,7 @@ typedef struct qp_rcuctx {
dns_qpmulti_t *multi;
ISC_LINK(struct qp_rcuctx) link;
dns_qpchunk_t count;
- dns_qpchunk_t chunk[];
+ dns_qpchunk_t chunk[] ISC_ATTR_COUNTED_BY(count);
} qp_rcuctx_t;
/*
diff --git a/lib/dns/qpcache.c b/lib/dns/qpcache.c
index c9f90d724e..a2b3852d9e 100644
--- a/lib/dns/qpcache.c
+++ b/lib/dns/qpcache.c
@@ -20,6 +20,7 @@
#include <isc/ascii.h>
#include <isc/async.h>
#include <isc/atomic.h>
+#include <isc/attributes.h>
#include <isc/file.h>
#include <isc/hex.h>
#include <isc/list.h>
@@ -213,7 +214,7 @@ struct qpcache {
dns_qp_t *tree;
size_t buckets_count;
- qpcache_bucket_t buckets[]; /* attribute((counted_by(buckets_count))) */
+ qpcache_bucket_t buckets[] ISC_ATTR_COUNTED_BY(buckets_count);
};
#ifdef DNS_DB_NODETRACE
diff --git a/lib/isc/crypto/ossl1_1.c b/lib/isc/crypto/ossl1_1.c
index 7456afc245..46622de71a 100644
--- a/lib/isc/crypto/ossl1_1.c
+++ b/lib/isc/crypto/ossl1_1.c
@@ -22,6 +22,7 @@
#include <openssl/rand.h>
#include <openssl/ssl.h>
+#include <isc/attributes.h>
#include <isc/buffer.h>
#include <isc/crypto.h>
#include <isc/endian.h>
@@ -60,7 +61,7 @@ struct isc_hmac_key {
uint32_t len;
isc_mem_t *mctx;
EVP_MD *md;
- uint8_t secret[];
+ uint8_t secret[] ISC_ATTR_COUNTED_BY(len);
};
struct isc_crypto_quic_hp_protect {
diff --git a/lib/isc/crypto/ossl3.c b/lib/isc/crypto/ossl3.c
index 716786260d..bf2e108f2c 100644
--- a/lib/isc/crypto/ossl3.c
+++ b/lib/isc/crypto/ossl3.c
@@ -23,6 +23,7 @@
#include <openssl/rand.h>
#include <openssl/ssl.h>
+#include <isc/attributes.h>
#include <isc/buffer.h>
#include <isc/crypto.h>
#include <isc/hmac.h>
@@ -46,7 +47,7 @@ struct isc_hmac_key {
uint32_t len;
isc_mem_t *mctx;
const OSSL_PARAM *params;
- uint8_t secret[];
+ uint8_t secret[] ISC_ATTR_COUNTED_BY(len);
};
struct isc_crypto_quic_hp_protect {
diff --git a/lib/isc/histo.c b/lib/isc/histo.c
index c9eec23d60..985044ff07 100644
--- a/lib/isc/histo.c
+++ b/lib/isc/histo.c
@@ -21,6 +21,7 @@
#include <string.h>
#include <isc/atomic.h>
+#include <isc/attributes.h>
#include <isc/bit.h>
#include <isc/histo.h>
#include <isc/magic.h>
@@ -75,7 +76,7 @@ struct isc_histomulti {
unsigned int magic;
unsigned int size;
isc_refcount_t references;
- isc_histo_t *hg[];
+ isc_histo_t *hg[] ISC_ATTR_COUNTED_BY(size);
};
/**********************************************************************/
diff --git a/lib/isc/ht.c b/lib/isc/ht.c
index d86a1933c3..bd02a89282 100644
--- a/lib/isc/ht.c
+++ b/lib/isc/ht.c
@@ -15,6 +15,7 @@
#include <string.h>
#include <isc/ascii.h>
+#include <isc/attributes.h>
#include <isc/hash.h>
#include <isc/ht.h>
#include <isc/magic.h>
@@ -45,7 +46,7 @@ struct isc_ht_node {
isc_ht_node_t *next;
uint32_t hashval;
size_t keysize;
- unsigned char key[];
+ unsigned char key[] ISC_ATTR_COUNTED_BY(keysize);
};
struct isc_ht {
diff --git a/tests/bench/qpmulti.c b/tests/bench/qpmulti.c
index fb5f38c961..076faae7f6 100644
--- a/tests/bench/qpmulti.c
+++ b/tests/bench/qpmulti.c
@@ -18,6 +18,7 @@
#include <unistd.h>
#include <isc/async.h>
+#include <isc/attributes.h>
#include <isc/barrier.h>
#include <isc/lib.h>
#include <isc/list.h>
@@ -346,7 +347,7 @@ struct bench_state {
uint32_t read_ops_per_tx;
uint32_t read_tx_per_loop;
double zipf_skew;
- struct thread_args thread[];
+ struct thread_args thread[] ISC_ATTR_COUNTED_BY(nloops);
};
static void