Commit 286d8e3479 for bind

commit 286d8e3479ed949b1ecd9d23952a3b157e6a8f4f
Author: Alessio Podda <alessio@isc.org>
Date:   Fri Jul 3 20:10:58 2026 +0200

    Support fixed names in _Generic dns_name wrappers

    A similar pattern holds between dns_fixedname_t and dns_linkedname_t.
    Both need to be downcast to dns_name_t for "normal" name operations.
    In order to improve readabiltity, this commit extends the _Generic
    functions we added for dns_linkedname_t to dns_fixedname_t where it
    makes sense to do so.

diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c
index a26a2b58c0..04c88e097b 100644
--- a/bin/dig/dighost.c
+++ b/bin/dig/dighost.c
@@ -797,8 +797,7 @@ clone_lookup(dig_lookup_t *lookold, bool servers) {
 			sizeof(*looknew->ecs_addr));
 	}

-	dns_name_copy(dns_fixedname_name(&lookold->fdomain),
-		      dns_fixedname_name(&looknew->fdomain));
+	dns_name_copy(&lookold->fdomain, dns_fixedname_name(&looknew->fdomain));

 	if (servers) {
 		if (lookold->tls_ctx_cache != NULL) {
diff --git a/bin/named/config.c b/bin/named/config.c
index 7c4984c22a..d1c822c15c 100644
--- a/bin/named/config.c
+++ b/bin/named/config.c
@@ -295,7 +295,7 @@ named_config_getname(isc_mem_t *mctx, const cfg_obj_t *obj,
 		isc_mem_put(mctx, *namep, sizeof(**namep));
 		return result;
 	}
-	dns_name_dup(dns_fixedname_name(&fname), mctx, *namep);
+	dns_name_dup(&fname, mctx, *namep);

 	return ISC_R_SUCCESS;
 }
diff --git a/bin/named/nzd.c b/bin/named/nzd.c
index 60a9d16685..19ec6792d1 100644
--- a/bin/named/nzd.c
+++ b/bin/named/nzd.c
@@ -34,7 +34,7 @@ nzd_setkey(MDB_val *key, dns_name_t *name, char *namebuf, size_t buflen) {

 	dns_fixedname_init(&fixed);
 	dns_name_downcase(name, dns_fixedname_name(&fixed));
-	dns_name_format(dns_fixedname_name(&fixed), namebuf, buflen);
+	dns_name_format(&fixed, namebuf, buflen);

 	key->mv_data = namebuf;
 	key->mv_size = strlen(namebuf);
diff --git a/bin/named/zoneconf.c b/bin/named/zoneconf.c
index 8119788d9e..4509a0137d 100644
--- a/bin/named/zoneconf.c
+++ b/bin/named/zoneconf.c
@@ -263,8 +263,7 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, const cfg_obj_t *tconfig,
 				    "'%s' is not a valid name", str);
 			goto cleanup;
 		}
-		dns_name_format(dns_fixedname_name(&fident), namebuf,
-				sizeof(namebuf));
+		dns_name_format(&fident, namebuf, sizeof(namebuf));
 		isc_buffer_putstr(&dbuf, " ");
 		isc_buffer_putstr(&dbuf, namebuf);

@@ -293,8 +292,7 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, const cfg_obj_t *tconfig,
 					    "'%s' is not a valid name", str);
 				goto cleanup;
 			}
-			dns_name_format(dns_fixedname_name(&fname), namebuf,
-					sizeof(namebuf));
+			dns_name_format(&fname, namebuf, sizeof(namebuf));
 			isc_buffer_putstr(&dbuf, " ");
 			isc_buffer_putstr(&dbuf, namebuf);
 		}
diff --git a/bin/tests/system/dyndb/driver/syncptr.c b/bin/tests/system/dyndb/driver/syncptr.c
index 85a7e187c6..4921328bbe 100644
--- a/bin/tests/system/dyndb/driver/syncptr.c
+++ b/bin/tests/system/dyndb/driver/syncptr.c
@@ -240,8 +240,7 @@ syncptr(sample_instance_t *inst, dns_name_t *name, dns_rdata_t *addr_rdata,
 	/* Reverse zone is managed by this driver, prepare PTR record */
 	dns_zone_attach(ptr_zone, &syncptr->zone);
 	dns_name_copy(name, dns_fixedname_name(&syncptr->ptr_target_name));
-	dns_name_clone(dns_fixedname_name(&syncptr->ptr_target_name),
-		       &ptr_struct.ptr);
+	dns_name_clone(&syncptr->ptr_target_name, &ptr_struct.ptr);
 	dns_diff_init(inst->mctx, &syncptr->diff);
 	result = dns_rdata_fromstruct(&ptr_rdata, dns_rdataclass_in,
 				      dns_rdatatype_ptr, &ptr_struct,
diff --git a/bin/tools/mdig.c b/bin/tools/mdig.c
index 0ec425fc70..5ea6b13d5d 100644
--- a/bin/tools/mdig.c
+++ b/bin/tools/mdig.c
@@ -576,8 +576,7 @@ sendquery(struct query *query) {

 	dns_message_gettemprdataset(message, &qrdataset);

-	dns_name_clone(dns_fixedname_name(&queryname),
-		       dns_linkedname_name(qname));
+	dns_name_clone(&queryname, dns_linkedname_name(qname));
 	dns_rdataset_makequestion(qrdataset, query->rdclass, query->rdtype);
 	ISC_LIST_APPEND(qname->list, qrdataset, link);
 	dns_message_addname(message, qname, DNS_SECTION_QUESTION);
diff --git a/lib/dns/dnssec.c b/lib/dns/dnssec.c
index 75bbb50f9b..866476d2c5 100644
--- a/lib/dns/dnssec.c
+++ b/lib/dns/dnssec.c
@@ -194,7 +194,7 @@ digest_sig(dst_context_t *ctx, bool downcase, dns_rdata_t *sigrdata,
 			dns_name_downcase(dns_linkedname_name(&rrsig->signer),
 					  dns_fixedname_name(&fname)) ==
 			ISC_R_SUCCESS);
-		dns_name_toregion(dns_fixedname_name(&fname), &r);
+		dns_name_toregion(&fname, &r);
 	} else {
 		dns_name_toregion(&rrsig->signer, &r);
 	}
@@ -246,8 +246,7 @@ dns_dnssec_sign(const dns_name_t *name, dns_rdataset_t *set, dst_key_t *key,
 	RUNTIME_CHECK(dns_name_downcase(dst_key_name(key),
 					dns_fixedname_name(&fsigner)) ==
 		      ISC_R_SUCCESS);
-	dns_name_clone(dns_fixedname_name(&fsigner),
-		       dns_linkedname_name(&sig.signer));
+	dns_name_clone(&fsigner, dns_linkedname_name(&sig.signer));

 	sig.covered = set->type;
 	sig.algorithm = dst_algorithm_tosecalg(dst_key_alg(key));
@@ -293,7 +292,7 @@ dns_dnssec_sign(const dns_name_t *name, dns_rdataset_t *set, dst_key_t *key,
 	dns_fixedname_init(&fnewname);
 	RUNTIME_CHECK(dns_name_downcase(name, dns_fixedname_name(&fnewname)) ==
 		      ISC_R_SUCCESS);
-	dns_name_toregion(dns_fixedname_name(&fnewname), &r);
+	dns_name_toregion(&fnewname, &r);

 	/*
 	 * Create an envelope for each rdata: <name|type|class|ttl>.
@@ -526,7 +525,7 @@ again:
 			       dns_fixedname_name(&fnewname));
 	}

-	dns_name_toregion(dns_fixedname_name(&fnewname), &r);
+	dns_name_toregion(&fnewname, &r);

 	/*
 	 * Create an envelope for each rdata: <name|type|class|ttl>.
diff --git a/lib/dns/fixedname.c b/lib/dns/fixedname.c
index 22485fae85..737245079b 100644
--- a/lib/dns/fixedname.c
+++ b/lib/dns/fixedname.c
@@ -79,6 +79,11 @@ dns_fixedname_name(dns_fixedname_t *fixed) {
 	return dns_linkedname_name(&fixed->name_wl);
 }

+const dns_name_t *
+dns_fixedname_name_const(const dns_fixedname_t *fixed) {
+	return dns_linkedname_name_const(&fixed->name_wl);
+}
+
 dns_name_t *
 dns_fixedname_initname(dns_fixedname_t *fixed) {
 	dns_fixedname_init(fixed);
diff --git a/lib/dns/include/dns/fixedname.h b/lib/dns/include/dns/fixedname.h
index 6b325b5928..b312a71378 100644
--- a/lib/dns/include/dns/fixedname.h
+++ b/lib/dns/include/dns/fixedname.h
@@ -75,6 +75,9 @@ dns_fixedname_invalidate(dns_fixedname_t *fixed);
 dns_name_t *
 dns_fixedname_name(dns_fixedname_t *fixed);

+const dns_name_t *
+dns_fixedname_name_const(const dns_fixedname_t *fixed);
+
 dns_name_t *
 dns_fixedname_initname(dns_fixedname_t *fixed);

diff --git a/lib/dns/include/dns/name.h b/lib/dns/include/dns/name.h
index 15cdd0dbed..9d0a4620da 100644
--- a/lib/dns/include/dns/name.h
+++ b/lib/dns/include/dns/name.h
@@ -134,6 +134,12 @@ dns_linkedname_name_const(const dns_linkedname_t *nwl) {
 	return nwl != NULL ? &nwl->name : NULL;
 }

+dns_name_t *
+dns_fixedname_name(dns_fixedname_t *fixed);
+
+const dns_name_t *
+dns_fixedname_name_const(const dns_fixedname_t *fixed);
+
 static inline const dns_name_t *
 dns_name__readonly_arg(const dns_name_t *name) {
 	return name;
@@ -1462,12 +1468,14 @@ dns_name_belowroot(const dns_name_t *name) {
  * \li	'name' to be valid.
  */

-#define DNS_NAME__RO_ARG(arg)                               \
-	_Generic((arg),                                     \
-		dns_name_t *: dns_name__readonly_arg,       \
-		const dns_name_t *: dns_name__readonly_arg, \
-		dns_linkedname_t *: dns_linkedname_name,    \
-		const dns_linkedname_t *: dns_linkedname_name_const)(arg)
+#define DNS_NAME__RO_ARG(arg)                                        \
+	_Generic((arg),                                              \
+		dns_name_t *: dns_name__readonly_arg,                \
+		const dns_name_t *: dns_name__readonly_arg,          \
+		dns_linkedname_t *: dns_linkedname_name,             \
+		const dns_linkedname_t *: dns_linkedname_name_const, \
+		dns_fixedname_t *: dns_fixedname_name,               \
+		const dns_fixedname_t *: dns_fixedname_name_const)(arg)

 #define dns_name_clone(source, target) \
 	dns_name__clone(DNS_NAME__RO_ARG(source), target)
diff --git a/lib/dns/journal.c b/lib/dns/journal.c
index fd7a49ad2b..7eea2d13a6 100644
--- a/lib/dns/journal.c
+++ b/lib/dns/journal.c
@@ -2271,8 +2271,7 @@ diff_namespace(dns_db_t *dba, dns_dbversion_t *dbvera, dns_db_t *dbb,
 			}
 		}

-		t = dns_name_compare(dns_fixedname_name(&fixname[0]),
-				     dns_fixedname_name(&fixname[1]));
+		t = dns_name_compare(&fixname[0], &fixname[1]);
 		if (t < 0) {
 			dns_diff_appendlist(resultdiff, &diff[0]);
 			have[0] = false;
diff --git a/lib/dns/peer.c b/lib/dns/peer.c
index c5771703ec..c1744fee6c 100644
--- a/lib/dns/peer.c
+++ b/lib/dns/peer.c
@@ -491,7 +491,7 @@ dns_peer_setkeybycharp(dns_peer_t *peer, const char *keyval) {
 	name = isc_mem_get(peer->mem, sizeof(dns_name_t));

 	dns_name_init(name);
-	dns_name_dup(dns_fixedname_name(&fname), peer->mem, name);
+	dns_name_dup(&fname, peer->mem, name);

 	result = dns_peer_setkey(peer, &name);
 	if (result != ISC_R_SUCCESS) {
diff --git a/lib/dns/validator.c b/lib/dns/validator.c
index 3d21614fd1..4a83677f09 100644
--- a/lib/dns/validator.c
+++ b/lib/dns/validator.c
@@ -3147,12 +3147,11 @@ findnsec3proofs(dns_validator_t *val) {
 	if (!dns_name_empty(dns_fixedname_name(&val->closest))) {
 		char namebuf[DNS_NAME_FORMATSIZE];

-		dns_name_format(dns_fixedname_name(&val->closest), namebuf,
-				sizeof(namebuf));
+		dns_name_format(&val->closest, namebuf, sizeof(namebuf));
 		validator_log(val, ISC_LOG_DEBUG(3),
 			      "closest encloser from wildcard signature '%s'",
 			      namebuf);
-		dns_name_copy(dns_fixedname_name(&val->closest), closest);
+		dns_name_copy(&val->closest, closest);
 		closestp = NULL;
 	} else {
 		closestp = closest;
diff --git a/lib/isccfg/aclconf.c b/lib/isccfg/aclconf.c
index aee6e01290..006af491c4 100644
--- a/lib/isccfg/aclconf.c
+++ b/lib/isccfg/aclconf.c
@@ -161,7 +161,7 @@ convert_keyname(const cfg_obj_t *keyobj, isc_mem_t *mctx, dns_name_t *dnsname) {
 			    txtname);
 		return result;
 	}
-	dns_name_dup(dns_fixedname_name(&fixname), mctx, dnsname);
+	dns_name_dup(&fixname, mctx, dnsname);
 	return ISC_R_SUCCESS;
 }

diff --git a/lib/ns/query.c b/lib/ns/query.c
index 26e9a2b326..51dc034164 100644
--- a/lib/ns/query.c
+++ b/lib/ns/query.c
@@ -8559,8 +8559,8 @@ addnsec3:
 	 * Did we find the closest provable encloser instead?
 	 * If so add the nearest to the closest provable encloser.
 	 */
-	if (!dns_name_equal(name, dns_fixedname_name(&fixed))) {
-		count = dns_name_countlabels(dns_fixedname_name(&fixed)) + 1;
+	if (!dns_name_equal(name, &fixed)) {
+		count = dns_name_countlabels(&fixed) + 1;
 		dns_name_getlabelsequence(name,
 					  dns_name_countlabels(name) - count,
 					  count, dns_fixedname_name(&fixed));