Commit 6fecc802d5 for bind
commit 6fecc802d5c2b9d04bc2a3ff524a1bde899a0523
Author: Alessio Podda <alessio@isc.org>
Date: Wed Jul 8 14:52:00 2026 +0200
Use _Generic NSEC name arguments
Accept generic owner name arguments in the NSEC and NSEC3 negative
proof helpers.
This lets callers pass linked names directly while keeping the
implementations typed as dns_name_t.
diff --git a/lib/dns/include/dns/nsec.h b/lib/dns/include/dns/nsec.h
index be387c6e3c..56388bdbcc 100644
--- a/lib/dns/include/dns/nsec.h
+++ b/lib/dns/include/dns/nsec.h
@@ -98,11 +98,16 @@ dns_nsec_isset(const unsigned char *array, unsigned int type);
* Test if the corresponding 'type' bit is set in 'array'.
*/
+#define dns_nsec_noexistnodata(type, name, nsecname, nsecset, exists, data, \
+ wild, log, arg) \
+ dns__nsec_noexistnodata(type, DNS_NAME__RO_ARG(name), \
+ DNS_NAME__RO_ARG(nsecname), nsecset, exists, \
+ data, wild, log, arg)
isc_result_t
-dns_nsec_noexistnodata(dns_rdatatype_t type, const dns_name_t *name,
- const dns_name_t *nsecname, dns_rdataset_t *nsecset,
- bool *exists, bool *data, dns_name_t *wild,
- dns_nseclog_t log, void *arg);
+dns__nsec_noexistnodata(dns_rdatatype_t type, const dns_name_t *name,
+ const dns_name_t *nsecname, dns_rdataset_t *nsecset,
+ bool *exists, bool *data, dns_name_t *wild,
+ dns_nseclog_t log, void *arg);
/*%
* Return ISC_R_SUCCESS if we can determine that the name doesn't exist
* or we can determine whether there is data or not at the name.
diff --git a/lib/dns/include/dns/nsec3.h b/lib/dns/include/dns/nsec3.h
index 5751fd36d7..005431ea00 100644
--- a/lib/dns/include/dns/nsec3.h
+++ b/lib/dns/include/dns/nsec3.h
@@ -266,10 +266,17 @@ dns_nsec3param_deletechains(dns_db_t *db, dns_dbversion_t *ver,
* Mark NSEC3PARAM for deletion.
*/
+#define dns_nsec3_noexistnodata(type, name, nsec3name, nsec3set, zonename, \
+ exists, data, optout, unknown, setnearest, \
+ closest, nearest, logit, arg) \
+ dns__nsec3_noexistnodata(type, DNS_NAME__RO_ARG(name), \
+ DNS_NAME__RO_ARG(nsec3name), nsec3set, \
+ zonename, exists, data, optout, unknown, \
+ setnearest, closest, nearest, logit, arg)
isc_result_t
-dns_nsec3_noexistnodata(dns_rdatatype_t type, const dns_name_t *name,
- const dns_name_t *nsec3name, dns_rdataset_t *nsec3set,
- dns_name_t *zonename, bool *exists, bool *data,
- bool *optout, bool *unknown, bool *setnearest,
- dns_name_t *closest, dns_name_t *nearest,
- dns_nseclog_t logit, void *arg);
+dns__nsec3_noexistnodata(dns_rdatatype_t type, const dns_name_t *name,
+ const dns_name_t *nsec3name, dns_rdataset_t *nsec3set,
+ dns_name_t *zonename, bool *exists, bool *data,
+ bool *optout, bool *unknown, bool *setnearest,
+ dns_name_t *closest, dns_name_t *nearest,
+ dns_nseclog_t logit, void *arg);
diff --git a/lib/dns/nsec.c b/lib/dns/nsec.c
index dd91e0c9bf..4e211abe20 100644
--- a/lib/dns/nsec.c
+++ b/lib/dns/nsec.c
@@ -308,10 +308,10 @@ dns_nsec_nseconly(dns_db_t *db, dns_dbversion_t *version, dns_diff_t *diff,
* Return ISC_R_IGNORE when the NSEC is not the appropriate one.
*/
isc_result_t
-dns_nsec_noexistnodata(dns_rdatatype_t type, const dns_name_t *name,
- const dns_name_t *nsecname, dns_rdataset_t *nsecset,
- bool *exists, bool *data, dns_name_t *wild,
- dns_nseclog_t logit, void *arg) {
+dns__nsec_noexistnodata(dns_rdatatype_t type, const dns_name_t *name,
+ const dns_name_t *nsecname, dns_rdataset_t *nsecset,
+ bool *exists, bool *data, dns_name_t *wild,
+ dns_nseclog_t logit, void *arg) {
int order;
dns_rdata_t rdata = DNS_RDATA_INIT;
isc_result_t result;
diff --git a/lib/dns/nsec3.c b/lib/dns/nsec3.c
index a99b850a96..11ce22a0a6 100644
--- a/lib/dns/nsec3.c
+++ b/lib/dns/nsec3.c
@@ -1719,12 +1719,12 @@ dns_nsec3_maxiterations(void) {
}
isc_result_t
-dns_nsec3_noexistnodata(dns_rdatatype_t type, const dns_name_t *name,
- const dns_name_t *nsec3name, dns_rdataset_t *nsec3set,
- dns_name_t *zonename, bool *exists, bool *data,
- bool *optout, bool *unknown, bool *setnearest,
- dns_name_t *closest, dns_name_t *nearest,
- dns_nseclog_t logit, void *arg) {
+dns__nsec3_noexistnodata(dns_rdatatype_t type, const dns_name_t *name,
+ const dns_name_t *nsec3name, dns_rdataset_t *nsec3set,
+ dns_name_t *zonename, bool *exists, bool *data,
+ bool *optout, bool *unknown, bool *setnearest,
+ dns_name_t *closest, dns_name_t *nearest,
+ dns_nseclog_t logit, void *arg) {
char namebuf[DNS_NAME_FORMATSIZE];
dns_fixedname_t fzone;
dns_fixedname_t qfixed;
diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c
index cbef2ce46f..6618b1815c 100644
--- a/lib/dns/resolver.c
+++ b/lib/dns/resolver.c
@@ -6087,9 +6087,8 @@ findnoqname(fetchctx_t *fctx, dns_message_t *message, dns_linkedname_t *name,
if (nrdataset->type == dns_rdatatype_nsec &&
NXND(dns_nsec_noexistnodata(
- type, dns_linkedname_name(name),
- dns_linkedname_name(nsec), nrdataset,
- &exists, &data, NULL, fctx_log, fctx)))
+ type, name, nsec, nrdataset, &exists, &data,
+ NULL, fctx_log, fctx)))
{
if (!exists) {
noqname = nsec;
@@ -6099,9 +6098,8 @@ findnoqname(fetchctx_t *fctx, dns_message_t *message, dns_linkedname_t *name,
if (nrdataset->type == dns_rdatatype_nsec3 &&
NXND(dns_nsec3_noexistnodata(
- type, dns_linkedname_name(name),
- dns_linkedname_name(nsec), nrdataset,
- zonename, &exists, &data, &optout, &unknown,
+ type, name, nsec, nrdataset, zonename,
+ &exists, &data, &optout, &unknown,
&setnearest, closest, nearest, fctx_log,
fctx)))
{
diff --git a/lib/dns/validator.c b/lib/dns/validator.c
index 4a83677f09..53a65d1128 100644
--- a/lib/dns/validator.c
+++ b/lib/dns/validator.c
@@ -1151,11 +1151,10 @@ validator_callback_nsec(void *arg) {
!FOUNDNODATA(val) && !FOUNDNOQNAME(val) &&
dns_name_issubdomain(val->name,
&subvalidator->siginfo->signer) &&
- dns_nsec_noexistnodata(
- val->type, dns_linkedname_name(val->name),
- dns_linkedname_name(subvalidator->name), rdataset,
- &exists, &data, wild, validator_log,
- val) == ISC_R_SUCCESS)
+ dns_nsec_noexistnodata(val->type, val->name,
+ subvalidator->name, rdataset,
+ &exists, &data, wild, validator_log,
+ val) == ISC_R_SUCCESS)
{
if (exists && !data) {
val->attributes |= VALATTR_FOUNDNODATA;
@@ -3048,15 +3047,14 @@ checkwildcard(dns_validator_t *val, dns_rdatatype_t type,
dns_linkedname_t **proofs = val->proofs;
switch (rdataset->type) {
case dns_rdatatype_nsec:
- result = valid_nsec_signer(
- val, dns_linkedname_name(name), zonename);
+ result = valid_nsec_signer(val, dns_name(name),
+ zonename);
if (result != ISC_R_SUCCESS) {
continue;
}
result = dns_nsec_noexistnodata(
- val->type, wild, dns_linkedname_name(name),
- rdataset, &exists, &data, NULL, validator_log,
- val);
+ val->type, wild, name, rdataset, &exists, &data,
+ NULL, validator_log, val);
if (result != ISC_R_SUCCESS) {
continue;
@@ -3064,9 +3062,9 @@ checkwildcard(dns_validator_t *val, dns_rdatatype_t type,
break;
case dns_rdatatype_nsec3:
result = dns_nsec3_noexistnodata(
- val->type, wild, dns_linkedname_name(name),
- rdataset, zonename, &exists, &data, NULL, NULL,
- NULL, NULL, NULL, validator_log, val);
+ val->type, wild, name, rdataset, zonename,
+ &exists, &data, NULL, NULL, NULL, NULL, NULL,
+ validator_log, val);
if (result != ISC_R_SUCCESS) {
continue;
}
@@ -3129,8 +3127,7 @@ findnsec3proofs(dns_validator_t *val) {
}
result = dns_nsec3_noexistnodata(
- val->type, dns_linkedname_name(val->name),
- dns_linkedname_name(name), rdataset, zonename, NULL,
+ val->type, val->name, name, rdataset, zonename, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, validator_log, val);
if (result != ISC_R_IGNORE && result != ISC_R_SUCCESS) {
CLEANUP(result);
@@ -3175,8 +3172,7 @@ findnsec3proofs(dns_validator_t *val) {
optout = false;
unknown = false;
result = dns_nsec3_noexistnodata(
- val->type, dns_linkedname_name(val->name),
- dns_linkedname_name(name), rdataset, zonename, &exists,
+ val->type, val->name, name, rdataset, zonename, &exists,
&data, &optout, &unknown, &setnearest, closestp,
nearest, validator_log, val);
if (unknown) {