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));