diff --git a/bin/tests/system/resolver/ns6/example.net.db.in b/bin/tests/system/resolver/ns6/example.net.db.in index eab3267b79..e3699c1889 100644 --- a/bin/tests/system/resolver/ns6/example.net.db.in +++ b/bin/tests/system/resolver/ns6/example.net.db.in @@ -13,6 +13,17 @@ $TTL 600 @ IN MX 0 mail ns IN A 10.53.0.6 mail IN A 10.53.0.6 +www IN HTTPS 0 http-server +http-server IN A 10.53.0.6 +https-loop IN HTTPS 0 https-next +https-loop IN A 10.53.0.6 +https-next IN HTTPS 0 https-loop +https-next IN A 10.53.0.7 +https-cname IN HTTPS 0 cname-server +cname-server IN CNAME cname-next +cname-next IN CNAME http-server +https-cname-loop IN HTTPS 0 https-cname-loop0 +https-cname-loop0 IN CNAME https-cname-loop0 fetch 10 IN TXT A short ttl non-zero 10 IN TXT A short ttl zero 0 IN TXT A zero ttl diff --git a/bin/tests/system/resolver/ns6/named.conf.in b/bin/tests/system/resolver/ns6/named.conf.in index 1726d5fa5b..5c631ae111 100644 --- a/bin/tests/system/resolver/ns6/named.conf.in +++ b/bin/tests/system/resolver/ns6/named.conf.in @@ -28,6 +28,7 @@ options { * has a exclude list. */ root-delegation-only exclude { "a"; }; + max-udp-size 4096; }; zone "." { diff --git a/bin/tests/system/resolver/ns7/named1.conf.in b/bin/tests/system/resolver/ns7/named1.conf.in index 47ce301e86..ec4ade0c51 100644 --- a/bin/tests/system/resolver/ns7/named1.conf.in +++ b/bin/tests/system/resolver/ns7/named1.conf.in @@ -29,6 +29,7 @@ options { */ prefetch 0; querylog yes; + edns-udp-size 4096; }; key rndc_key { diff --git a/bin/tests/system/resolver/ns7/named2.conf.in b/bin/tests/system/resolver/ns7/named2.conf.in index 47ce301e86..ec4ade0c51 100644 --- a/bin/tests/system/resolver/ns7/named2.conf.in +++ b/bin/tests/system/resolver/ns7/named2.conf.in @@ -29,6 +29,7 @@ options { */ prefetch 0; querylog yes; + edns-udp-size 4096; }; key rndc_key { diff --git a/bin/tests/system/resolver/tests.sh b/bin/tests/system/resolver/tests.sh index 435501c2a4..165b196b70 100755 --- a/bin/tests/system/resolver/tests.sh +++ b/bin/tests/system/resolver/tests.sh @@ -845,5 +845,49 @@ grep "status: NXDOMAIN" dig.ns1.out.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo_i "failed"; fi status=`expr $status + $ret` +n=`expr $n + 1` +echo_i "check that the addition section for HTTPS is populated on initial query to a recursive server ($n)" +ret=0 +$DIG $DIGOPTS @10.53.0.7 www.example.net https > dig.out.ns7.${n} || ret=1 +grep "status: NOERROR" dig.out.ns7.${n} > /dev/null || ret=1 +grep "flags:[^;]* ra[ ;]" dig.out.ns7.${n} > /dev/null || ret=1 +grep "ADDITIONAL: 2" dig.out.ns7.${n} > /dev/null || ret=1 +grep "ANSWER: 1," dig.out.ns7.${n} > /dev/null || ret=1 +grep "http-server\.example\.net\..*A.*10\.53\.0\.6" dig.out.ns7.${n} > /dev/null || ret=1 +if [ $ret != 0 ]; then echo_i "failed"; fi +status=`expr $status + $ret` + +n=`expr $n + 1` +echo_i "check HTTPS loop is handled properly ($n)" +ret=0 +$DIG $DIGOPTS @10.53.0.7 https-loop.example.net https > dig.out.ns7.${n} || ret=1 +grep "status: NOERROR" dig.out.ns7.${n} > /dev/null || ret=1 +grep "ANSWER: 1," dig.out.ns7.${n} > /dev/null || ret=1 +grep "ADDITIONAL: 2" dig.out.ns7.${n} > /dev/null || ret=1 +if [ $ret != 0 ]; then echo_i "failed"; fi +status=`expr $status + $ret` + +n=`expr $n + 1` +echo_i "check HTTPS -> CNAME loop is handled properly ($n)" +ret=0 +$DIG $DIGOPTS @10.53.0.7 https-cname-loop.example.net https > dig.out.ns7.${n} || ret=1 +grep "status: NOERROR" dig.out.ns7.${n} > /dev/null || ret=1 +grep "ADDITIONAL: 2" dig.out.ns7.${n} > /dev/null || ret=1 +grep "ANSWER: 1," dig.out.ns7.${n} > /dev/null || ret=1 +if [ $ret != 0 ]; then echo_i "failed"; fi +status=`expr $status + $ret` + +n=`expr $n + 1` +echo_i "check HTTPS cname chains are followed ($n)" +ret=0 +$DIG $DIGOPTS @10.53.0.7 https-cname.example.net https > dig.out.ns7.${n} || ret=1 +grep "status: NOERROR" dig.out.ns7.${n} > /dev/null || ret=1 +grep "ADDITIONAL: 4" dig.out.ns7.${n} > /dev/null || ret=1 +grep 'http-server\.example\.net\..*A.10\.53\.0\.6' dig.out.ns7.${n} > /dev/null || ret=1 +grep 'cname-server\.example\.net\..*CNAME.cname-next\.example\.net\.' dig.out.ns7.${n} > /dev/null || ret=1 +grep 'cname-next\.example\.net\..*CNAME.http-server\.example\.net\.' dig.out.ns7.${n} > /dev/null || ret=1 +if [ $ret != 0 ]; then echo_i "failed"; fi +status=`expr $status + $ret` + echo_i "exit status: $status" [ $status -eq 0 ] || exit 1 diff --git a/lib/dns/gen.c b/lib/dns/gen.c index 2939c175e7..09b877e6ff 100644 --- a/lib/dns/gen.c +++ b/lib/dns/gen.c @@ -78,7 +78,7 @@ #define COMPARETYPE "rdata1->type" #define COMPAREDEF "use_default = true" -#define ADDITIONALDATAARGS "rdata, add, arg" +#define ADDITIONALDATAARGS "rdata, owner, add, arg" #define ADDITIONALDATACLASS "rdata->rdclass" #define ADDITIONALDATATYPE "rdata->type" #define ADDITIONALDATADEF "use_default = true" diff --git a/lib/dns/include/dns/rdata.h b/lib/dns/include/dns/rdata.h index 476ef5f9c7..245b69b29c 100644 --- a/lib/dns/include/dns/rdata.h +++ b/lib/dns/include/dns/rdata.h @@ -594,8 +594,8 @@ dns_rdatatype_isknown(dns_rdatatype_t type); */ isc_result_t -dns_rdata_additionaldata(dns_rdata_t *rdata, dns_additionaldatafunc_t add, - void *arg); +dns_rdata_additionaldata(dns_rdata_t *rdata, const dns_name_t *owner, + dns_additionaldatafunc_t add, void *arg); /*%< * Call 'add' for each name and type from 'rdata' which is subject to * additional section processing. diff --git a/lib/dns/include/dns/rdataset.h b/lib/dns/include/dns/rdataset.h index 2569e40d23..f5a4f2be35 100644 --- a/lib/dns/include/dns/rdataset.h +++ b/lib/dns/include/dns/rdataset.h @@ -439,6 +439,7 @@ dns_rdataset_towirepartial(dns_rdataset_t * rdataset, isc_result_t dns_rdataset_additionaldata(dns_rdataset_t * rdataset, + const dns_name_t * owner_name, dns_additionaldatafunc_t add, void *arg); /*%< * For each rdata in rdataset, call 'add' for each name and type in the diff --git a/lib/dns/include/dns/types.h b/lib/dns/include/dns/types.h index 21ced9e4e6..f42bd80cd7 100644 --- a/lib/dns/include/dns/types.h +++ b/lib/dns/include/dns/types.h @@ -396,7 +396,8 @@ typedef isc_result_t (*dns_addrdatasetfunc_t)(void *, const dns_name_t *, dns_rdataset_t *); typedef isc_result_t (*dns_additionaldatafunc_t)(void *, const dns_name_t *, - dns_rdatatype_t); + dns_rdatatype_t, + dns_rdataset_t *); typedef isc_result_t (*dns_digestfunc_t)(void *, isc_region_t *); diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 32355c1398..3b5035ea34 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -10084,7 +10084,8 @@ maybe_rehash_gluetable(rbtdb_version_t *version) { } static isc_result_t -glue_nsdname_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype) { +glue_nsdname_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype, + dns_rdataset_t *unused) { rbtdb_glue_additionaldata_ctx_t *ctx; isc_result_t result; dns_fixedname_t fixedname_a; @@ -10098,6 +10099,8 @@ glue_nsdname_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype) { rbtdb_glue_t *glue = NULL; dns_name_t *gluename = NULL; + UNUSED(unused); + /* * NS records want addresses in additional records. */ @@ -10397,7 +10400,8 @@ no_glue: maybe_rehash_gluetable(rbtversion); idx = hash_32(hash, rbtversion->glue_table_bits); - (void)dns_rdataset_additionaldata(rdataset, glue_nsdname_cb, &ctx); + (void)dns_rdataset_additionaldata(rdataset, dns_rootname, + glue_nsdname_cb, &ctx); cur = isc_mem_get(rbtdb->common.mctx, sizeof(*cur)); diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c index 29e472c266..a655233204 100644 --- a/lib/dns/rdata.c +++ b/lib/dns/rdata.c @@ -29,12 +29,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -118,10 +120,11 @@ #define CALL_FREESTRUCT source -#define ARGS_ADDLDATA \ - dns_rdata_t *rdata, dns_additionaldatafunc_t add, void *arg +#define ARGS_ADDLDATA \ + dns_rdata_t *rdata, const dns_name_t *owner, \ + dns_additionaldatafunc_t add, void *arg -#define CALL_ADDLDATA rdata, add, arg +#define CALL_ADDLDATA rdata, owner, add, arg #define ARGS_DIGEST dns_rdata_t *rdata, dns_digestfunc_t digest, void *arg @@ -1265,8 +1268,8 @@ dns_rdata_freestruct(void *source) { } isc_result_t -dns_rdata_additionaldata(dns_rdata_t *rdata, dns_additionaldatafunc_t add, - void *arg) { +dns_rdata_additionaldata(dns_rdata_t *rdata, const dns_name_t *owner, + dns_additionaldatafunc_t add, void *arg) { isc_result_t result = ISC_R_NOTIMPLEMENTED; bool use_default = false; diff --git a/lib/dns/rdata/any_255/tsig_250.c b/lib/dns/rdata/any_255/tsig_250.c index 0fb1211d13..083bde3345 100644 --- a/lib/dns/rdata/any_255/tsig_250.c +++ b/lib/dns/rdata/any_255/tsig_250.c @@ -567,6 +567,7 @@ additionaldata_any_tsig(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_any); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/ch_3/a_1.c b/lib/dns/rdata/ch_3/a_1.c index 23163a0e50..0df83160cb 100644 --- a/lib/dns/rdata/ch_3/a_1.c +++ b/lib/dns/rdata/ch_3/a_1.c @@ -261,6 +261,7 @@ additionaldata_ch_a(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_ch); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/afsdb_18.c b/lib/dns/rdata/generic/afsdb_18.c index 7fe396c7c5..d2b84b7273 100644 --- a/lib/dns/rdata/generic/afsdb_18.c +++ b/lib/dns/rdata/generic/afsdb_18.c @@ -247,12 +247,14 @@ additionaldata_afsdb(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_afsdb); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); isc_region_consume(®ion, 2); dns_name_fromregion(&name, ®ion); - return ((add)(arg, &name, dns_rdatatype_a)); + return ((add)(arg, &name, dns_rdatatype_a, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/generic/amtrelay_260.c b/lib/dns/rdata/generic/amtrelay_260.c index 4e200049de..1cd8d1dd92 100644 --- a/lib/dns/rdata/generic/amtrelay_260.c +++ b/lib/dns/rdata/generic/amtrelay_260.c @@ -395,6 +395,7 @@ additionaldata_amtrelay(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_amtrelay); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/avc_258.c b/lib/dns/rdata/generic/avc_258.c index c269f01e4f..5f3de214be 100644 --- a/lib/dns/rdata/generic/avc_258.c +++ b/lib/dns/rdata/generic/avc_258.c @@ -95,6 +95,7 @@ additionaldata_avc(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_avc); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/caa_257.c b/lib/dns/rdata/generic/caa_257.c index 60c95a5a81..b443aa7d13 100644 --- a/lib/dns/rdata/generic/caa_257.c +++ b/lib/dns/rdata/generic/caa_257.c @@ -572,6 +572,7 @@ additionaldata_caa(ARGS_ADDLDATA) { REQUIRE(rdata->length >= 3U); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/cdnskey_60.c b/lib/dns/rdata/generic/cdnskey_60.c index 2fb006a31a..9eea7d6b8c 100644 --- a/lib/dns/rdata/generic/cdnskey_60.c +++ b/lib/dns/rdata/generic/cdnskey_60.c @@ -108,6 +108,7 @@ additionaldata_cdnskey(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_cdnskey); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/cds_59.c b/lib/dns/rdata/generic/cds_59.c index 56a847be59..26cc70d427 100644 --- a/lib/dns/rdata/generic/cds_59.c +++ b/lib/dns/rdata/generic/cds_59.c @@ -116,6 +116,7 @@ additionaldata_cds(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_cds); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/cert_37.c b/lib/dns/rdata/generic/cert_37.c index 8a171f8a4f..34f5ef7c9f 100644 --- a/lib/dns/rdata/generic/cert_37.c +++ b/lib/dns/rdata/generic/cert_37.c @@ -235,6 +235,7 @@ additionaldata_cert(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_cert); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/cname_5.c b/lib/dns/rdata/generic/cname_5.c index 69c28902fc..aa45ad3713 100644 --- a/lib/dns/rdata/generic/cname_5.c +++ b/lib/dns/rdata/generic/cname_5.c @@ -175,6 +175,7 @@ freestruct_cname(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_cname(ARGS_ADDLDATA) { UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/csync_62.c b/lib/dns/rdata/generic/csync_62.c index 66c37a6f16..eb41bcb640 100644 --- a/lib/dns/rdata/generic/csync_62.c +++ b/lib/dns/rdata/generic/csync_62.c @@ -214,6 +214,7 @@ additionaldata_csync(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_csync); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/dlv_32769.c b/lib/dns/rdata/generic/dlv_32769.c index 3b996adb1b..21ae76df86 100644 --- a/lib/dns/rdata/generic/dlv_32769.c +++ b/lib/dns/rdata/generic/dlv_32769.c @@ -112,6 +112,7 @@ additionaldata_dlv(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_dlv); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/dname_39.c b/lib/dns/rdata/generic/dname_39.c index 468a6e8a60..6964249b2e 100644 --- a/lib/dns/rdata/generic/dname_39.c +++ b/lib/dns/rdata/generic/dname_39.c @@ -175,12 +175,13 @@ freestruct_dname(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_dname(ARGS_ADDLDATA) { + REQUIRE(rdata->type == dns_rdatatype_dname); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_dname); - return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/dnskey_48.c b/lib/dns/rdata/generic/dnskey_48.c index 1aa3f532e4..ca557bf59d 100644 --- a/lib/dns/rdata/generic/dnskey_48.c +++ b/lib/dns/rdata/generic/dnskey_48.c @@ -109,6 +109,7 @@ additionaldata_dnskey(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_dnskey); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/doa_259.c b/lib/dns/rdata/generic/doa_259.c index c8a735b180..5de79296c0 100644 --- a/lib/dns/rdata/generic/doa_259.c +++ b/lib/dns/rdata/generic/doa_259.c @@ -308,12 +308,13 @@ freestruct_doa(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_doa(ARGS_ADDLDATA) { + REQUIRE(rdata->type == dns_rdatatype_doa); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_doa); - return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/ds_43.c b/lib/dns/rdata/generic/ds_43.c index bbfd136a68..0b91301c31 100644 --- a/lib/dns/rdata/generic/ds_43.c +++ b/lib/dns/rdata/generic/ds_43.c @@ -335,6 +335,7 @@ additionaldata_ds(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_ds); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/eui48_108.c b/lib/dns/rdata/generic/eui48_108.c index 7be59c2c69..1a9820bbee 100644 --- a/lib/dns/rdata/generic/eui48_108.c +++ b/lib/dns/rdata/generic/eui48_108.c @@ -159,6 +159,7 @@ additionaldata_eui48(ARGS_ADDLDATA) { REQUIRE(rdata->length == 6); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/eui64_109.c b/lib/dns/rdata/generic/eui64_109.c index 381b87bbb8..50220c5199 100644 --- a/lib/dns/rdata/generic/eui64_109.c +++ b/lib/dns/rdata/generic/eui64_109.c @@ -162,6 +162,7 @@ additionaldata_eui64(ARGS_ADDLDATA) { REQUIRE(rdata->length == 8); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/gpos_27.c b/lib/dns/rdata/generic/gpos_27.c index d719fcc5e1..8bdfbdaae1 100644 --- a/lib/dns/rdata/generic/gpos_27.c +++ b/lib/dns/rdata/generic/gpos_27.c @@ -205,6 +205,7 @@ additionaldata_gpos(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_gpos); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/hinfo_13.c b/lib/dns/rdata/generic/hinfo_13.c index 2d5ed3e338..2e8a032bde 100644 --- a/lib/dns/rdata/generic/hinfo_13.c +++ b/lib/dns/rdata/generic/hinfo_13.c @@ -169,9 +169,10 @@ static inline isc_result_t additionaldata_hinfo(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_hinfo); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - UNUSED(rdata); return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/hip_55.c b/lib/dns/rdata/generic/hip_55.c index 9ead94ed4b..77d774e37b 100644 --- a/lib/dns/rdata/generic/hip_55.c +++ b/lib/dns/rdata/generic/hip_55.c @@ -379,12 +379,13 @@ freestruct_hip(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_hip(ARGS_ADDLDATA) { + REQUIRE(rdata->type == dns_rdatatype_hip); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_hip); - return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/ipseckey_45.c b/lib/dns/rdata/generic/ipseckey_45.c index d93f3e4ab9..5404039216 100644 --- a/lib/dns/rdata/generic/ipseckey_45.c +++ b/lib/dns/rdata/generic/ipseckey_45.c @@ -440,6 +440,7 @@ additionaldata_ipseckey(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_ipseckey); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/isdn_20.c b/lib/dns/rdata/generic/isdn_20.c index 264c7a0724..3054590d7c 100644 --- a/lib/dns/rdata/generic/isdn_20.c +++ b/lib/dns/rdata/generic/isdn_20.c @@ -196,6 +196,7 @@ additionaldata_isdn(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_isdn); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/key_25.c b/lib/dns/rdata/generic/key_25.c index 5867beee35..1351bfdd23 100644 --- a/lib/dns/rdata/generic/key_25.c +++ b/lib/dns/rdata/generic/key_25.c @@ -415,6 +415,7 @@ additionaldata_key(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_key); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/keydata_65533.c b/lib/dns/rdata/generic/keydata_65533.c index 6c78c98a1f..ae8d438e2e 100644 --- a/lib/dns/rdata/generic/keydata_65533.c +++ b/lib/dns/rdata/generic/keydata_65533.c @@ -412,6 +412,7 @@ additionaldata_keydata(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_keydata); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/l32_105.c b/lib/dns/rdata/generic/l32_105.c index b887285eb5..b2f02df646 100644 --- a/lib/dns/rdata/generic/l32_105.c +++ b/lib/dns/rdata/generic/l32_105.c @@ -178,6 +178,7 @@ additionaldata_l32(ARGS_ADDLDATA) { REQUIRE(rdata->length == 6); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/l64_106.c b/lib/dns/rdata/generic/l64_106.c index c225b0f6ef..6ff8fa83bd 100644 --- a/lib/dns/rdata/generic/l64_106.c +++ b/lib/dns/rdata/generic/l64_106.c @@ -172,6 +172,7 @@ additionaldata_l64(ARGS_ADDLDATA) { REQUIRE(rdata->length == 10); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/loc_29.c b/lib/dns/rdata/generic/loc_29.c index 478723ae6c..8c8afc374c 100644 --- a/lib/dns/rdata/generic/loc_29.c +++ b/lib/dns/rdata/generic/loc_29.c @@ -785,6 +785,7 @@ additionaldata_loc(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_loc); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/lp_107.c b/lib/dns/rdata/generic/lp_107.c index ed4cd199e3..7164394aac 100644 --- a/lib/dns/rdata/generic/lp_107.c +++ b/lib/dns/rdata/generic/lp_107.c @@ -193,16 +193,18 @@ additionaldata_lp(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_lp); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); isc_region_consume(®ion, 2); dns_name_fromregion(&name, ®ion); - result = (add)(arg, &name, dns_rdatatype_l32); + result = (add)(arg, &name, dns_rdatatype_l32, NULL); if (result != ISC_R_SUCCESS) { return (result); } - return ((add)(arg, &name, dns_rdatatype_l64)); + return ((add)(arg, &name, dns_rdatatype_l64, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/generic/mb_7.c b/lib/dns/rdata/generic/mb_7.c index 9a037cc7ba..0702fbe490 100644 --- a/lib/dns/rdata/generic/mb_7.c +++ b/lib/dns/rdata/generic/mb_7.c @@ -179,11 +179,13 @@ additionaldata_mb(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_mb); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); - return ((add)(arg, &name, dns_rdatatype_a)); + return ((add)(arg, &name, dns_rdatatype_a, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/generic/md_3.c b/lib/dns/rdata/generic/md_3.c index 78c36f92ef..cff5e91c3c 100644 --- a/lib/dns/rdata/generic/md_3.c +++ b/lib/dns/rdata/generic/md_3.c @@ -180,11 +180,13 @@ additionaldata_md(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_md); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); - return ((add)(arg, &name, dns_rdatatype_a)); + return ((add)(arg, &name, dns_rdatatype_a, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/generic/mf_4.c b/lib/dns/rdata/generic/mf_4.c index 8d2c2b8482..13b63561fe 100644 --- a/lib/dns/rdata/generic/mf_4.c +++ b/lib/dns/rdata/generic/mf_4.c @@ -179,11 +179,13 @@ additionaldata_mf(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_mf); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); - return ((add)(arg, &name, dns_rdatatype_a)); + return ((add)(arg, &name, dns_rdatatype_a, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/generic/mg_8.c b/lib/dns/rdata/generic/mg_8.c index 0b60c90951..efaa0a34be 100644 --- a/lib/dns/rdata/generic/mg_8.c +++ b/lib/dns/rdata/generic/mg_8.c @@ -178,6 +178,7 @@ additionaldata_mg(ARGS_ADDLDATA) { UNUSED(add); UNUSED(arg); UNUSED(rdata); + UNUSED(owner); return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/minfo_14.c b/lib/dns/rdata/generic/minfo_14.c index 7394e3f292..62b5897bc6 100644 --- a/lib/dns/rdata/generic/minfo_14.c +++ b/lib/dns/rdata/generic/minfo_14.c @@ -253,6 +253,7 @@ additionaldata_minfo(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_minfo); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/mr_9.c b/lib/dns/rdata/generic/mr_9.c index 295cf6ed1a..6205358313 100644 --- a/lib/dns/rdata/generic/mr_9.c +++ b/lib/dns/rdata/generic/mr_9.c @@ -176,6 +176,7 @@ additionaldata_mr(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_mr); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/mx_15.c b/lib/dns/rdata/generic/mx_15.c index 9bddb45ee0..2b5fe03f54 100644 --- a/lib/dns/rdata/generic/mx_15.c +++ b/lib/dns/rdata/generic/mx_15.c @@ -273,6 +273,8 @@ additionaldata_mx(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_mx); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); isc_region_consume(®ion, 2); @@ -282,7 +284,7 @@ additionaldata_mx(ARGS_ADDLDATA) { return (ISC_R_SUCCESS); } - result = (add)(arg, &name, dns_rdatatype_a); + result = (add)(arg, &name, dns_rdatatype_a, NULL); if (result != ISC_R_SUCCESS) { return (result); } @@ -294,7 +296,8 @@ additionaldata_mx(ARGS_ADDLDATA) { return (ISC_R_SUCCESS); } - return ((add)(arg, dns_fixedname_name(&fixed), dns_rdatatype_tlsa)); + return ((add)(arg, dns_fixedname_name(&fixed), dns_rdatatype_tlsa, + NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/generic/naptr_35.c b/lib/dns/rdata/generic/naptr_35.c index 04bb8e05a8..d8de8e9def 100644 --- a/lib/dns/rdata/generic/naptr_35.c +++ b/lib/dns/rdata/generic/naptr_35.c @@ -601,6 +601,8 @@ additionaldata_naptr(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_naptr); + UNUSED(owner); + /* * Order, preference. */ @@ -642,7 +644,7 @@ additionaldata_naptr(ARGS_ADDLDATA) { dns_name_fromregion(&name, &sr); if (atype != 0) { - return ((add)(arg, &name, atype)); + return ((add)(arg, &name, atype, NULL)); } return (ISC_R_SUCCESS); diff --git a/lib/dns/rdata/generic/nid_104.c b/lib/dns/rdata/generic/nid_104.c index d05a42ca30..d8f9afa815 100644 --- a/lib/dns/rdata/generic/nid_104.c +++ b/lib/dns/rdata/generic/nid_104.c @@ -172,6 +172,7 @@ additionaldata_nid(ARGS_ADDLDATA) { REQUIRE(rdata->length == 10); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/ninfo_56.c b/lib/dns/rdata/generic/ninfo_56.c index 0e74d522f0..a14356c0c7 100644 --- a/lib/dns/rdata/generic/ninfo_56.c +++ b/lib/dns/rdata/generic/ninfo_56.c @@ -95,6 +95,7 @@ additionaldata_ninfo(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_ninfo); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/ns_2.c b/lib/dns/rdata/generic/ns_2.c index 45a760c616..21ed02349e 100644 --- a/lib/dns/rdata/generic/ns_2.c +++ b/lib/dns/rdata/generic/ns_2.c @@ -190,11 +190,13 @@ additionaldata_ns(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_ns); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); - return ((add)(arg, &name, dns_rdatatype_a)); + return ((add)(arg, &name, dns_rdatatype_a, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/generic/nsec3_50.c b/lib/dns/rdata/generic/nsec3_50.c index e1eab66d5a..8f62a61533 100644 --- a/lib/dns/rdata/generic/nsec3_50.c +++ b/lib/dns/rdata/generic/nsec3_50.c @@ -362,6 +362,7 @@ additionaldata_nsec3(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_nsec3); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/nsec3param_51.c b/lib/dns/rdata/generic/nsec3param_51.c index 1cc56e5ae2..db3a97413c 100644 --- a/lib/dns/rdata/generic/nsec3param_51.c +++ b/lib/dns/rdata/generic/nsec3param_51.c @@ -272,6 +272,7 @@ additionaldata_nsec3param(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_nsec3param); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/nsec_47.c b/lib/dns/rdata/generic/nsec_47.c index 004d163089..f7e4693c33 100644 --- a/lib/dns/rdata/generic/nsec_47.c +++ b/lib/dns/rdata/generic/nsec_47.c @@ -213,6 +213,7 @@ additionaldata_nsec(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_nsec); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/null_10.c b/lib/dns/rdata/generic/null_10.c index f495d56a72..f13d052e24 100644 --- a/lib/dns/rdata/generic/null_10.c +++ b/lib/dns/rdata/generic/null_10.c @@ -133,12 +133,13 @@ freestruct_null(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_null(ARGS_ADDLDATA) { + REQUIRE(rdata->type == dns_rdatatype_null); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_null); - return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/nxt_30.c b/lib/dns/rdata/generic/nxt_30.c index 4065204fe1..d713f0192a 100644 --- a/lib/dns/rdata/generic/nxt_30.c +++ b/lib/dns/rdata/generic/nxt_30.c @@ -292,6 +292,7 @@ additionaldata_nxt(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_nxt); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/openpgpkey_61.c b/lib/dns/rdata/generic/openpgpkey_61.c index 7077eac71d..8c4bec53e4 100644 --- a/lib/dns/rdata/generic/openpgpkey_61.c +++ b/lib/dns/rdata/generic/openpgpkey_61.c @@ -187,6 +187,7 @@ additionaldata_openpgpkey(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_openpgpkey); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/opt_41.c b/lib/dns/rdata/generic/opt_41.c index 7dbb370386..6d6a127eaf 100644 --- a/lib/dns/rdata/generic/opt_41.c +++ b/lib/dns/rdata/generic/opt_41.c @@ -359,6 +359,7 @@ additionaldata_opt(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_opt); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/proforma.c b/lib/dns/rdata/generic/proforma.c index 7913d66162..1db5d9e469 100644 --- a/lib/dns/rdata/generic/proforma.c +++ b/lib/dns/rdata/generic/proforma.c @@ -103,8 +103,9 @@ static inline isc_result_t additionaldata_ #(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_proforma.c #); REQUIRE(rdata->rdclass == #); - (void)add; - (void)arg; + UNUSED(owner); + UNUSED(add); + UNUSED(arg); return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/ptr_12.c b/lib/dns/rdata/generic/ptr_12.c index 188676a660..bf689eb7c0 100644 --- a/lib/dns/rdata/generic/ptr_12.c +++ b/lib/dns/rdata/generic/ptr_12.c @@ -190,6 +190,7 @@ additionaldata_ptr(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_ptr); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/rkey_57.c b/lib/dns/rdata/generic/rkey_57.c index 7dd11a29e4..afa294daae 100644 --- a/lib/dns/rdata/generic/rkey_57.c +++ b/lib/dns/rdata/generic/rkey_57.c @@ -105,6 +105,7 @@ additionaldata_rkey(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_rkey); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/rp_17.c b/lib/dns/rdata/generic/rp_17.c index 70c3204d23..a44a2321ed 100644 --- a/lib/dns/rdata/generic/rp_17.c +++ b/lib/dns/rdata/generic/rp_17.c @@ -252,6 +252,7 @@ additionaldata_rp(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_rp); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/rrsig_46.c b/lib/dns/rdata/generic/rrsig_46.c index 40506d7ed6..e6ef8725d1 100644 --- a/lib/dns/rdata/generic/rrsig_46.c +++ b/lib/dns/rdata/generic/rrsig_46.c @@ -536,6 +536,7 @@ additionaldata_rrsig(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_rrsig); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/rt_21.c b/lib/dns/rdata/generic/rt_21.c index e54d02970a..08fb097bf3 100644 --- a/lib/dns/rdata/generic/rt_21.c +++ b/lib/dns/rdata/generic/rt_21.c @@ -241,20 +241,22 @@ additionaldata_rt(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_rt); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); isc_region_consume(®ion, 2); dns_name_fromregion(&name, ®ion); - result = (add)(arg, &name, dns_rdatatype_x25); + result = (add)(arg, &name, dns_rdatatype_x25, NULL); if (result != ISC_R_SUCCESS) { return (result); } - result = (add)(arg, &name, dns_rdatatype_isdn); + result = (add)(arg, &name, dns_rdatatype_isdn, NULL); if (result != ISC_R_SUCCESS) { return (result); } - return ((add)(arg, &name, dns_rdatatype_a)); + return ((add)(arg, &name, dns_rdatatype_a, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/generic/sig_24.c b/lib/dns/rdata/generic/sig_24.c index bfff78c663..fc9279eebe 100644 --- a/lib/dns/rdata/generic/sig_24.c +++ b/lib/dns/rdata/generic/sig_24.c @@ -528,6 +528,7 @@ additionaldata_sig(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_sig); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/sink_40.c b/lib/dns/rdata/generic/sink_40.c index 09bb04fab4..5d85652d9c 100644 --- a/lib/dns/rdata/generic/sink_40.c +++ b/lib/dns/rdata/generic/sink_40.c @@ -242,6 +242,7 @@ additionaldata_sink(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_sink); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/smimea_53.c b/lib/dns/rdata/generic/smimea_53.c index 8871369d9e..dd3894b30d 100644 --- a/lib/dns/rdata/generic/smimea_53.c +++ b/lib/dns/rdata/generic/smimea_53.c @@ -102,6 +102,7 @@ additionaldata_smimea(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_smimea); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/soa_6.c b/lib/dns/rdata/generic/soa_6.c index c30b079b58..c9fbc10afe 100644 --- a/lib/dns/rdata/generic/soa_6.c +++ b/lib/dns/rdata/generic/soa_6.c @@ -370,12 +370,13 @@ freestruct_soa(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_soa(ARGS_ADDLDATA) { + REQUIRE(rdata->type == dns_rdatatype_soa); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_soa); - return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/spf_99.c b/lib/dns/rdata/generic/spf_99.c index 4687324e30..29d5c54fa5 100644 --- a/lib/dns/rdata/generic/spf_99.c +++ b/lib/dns/rdata/generic/spf_99.c @@ -96,6 +96,7 @@ additionaldata_spf(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_spf); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/sshfp_44.c b/lib/dns/rdata/generic/sshfp_44.c index 9c604c1380..8c91d8fbcc 100644 --- a/lib/dns/rdata/generic/sshfp_44.c +++ b/lib/dns/rdata/generic/sshfp_44.c @@ -246,6 +246,7 @@ additionaldata_sshfp(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_sshfp); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/ta_32768.c b/lib/dns/rdata/generic/ta_32768.c index 93e095d4ac..69875c36ab 100644 --- a/lib/dns/rdata/generic/ta_32768.c +++ b/lib/dns/rdata/generic/ta_32768.c @@ -112,6 +112,7 @@ additionaldata_ta(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_ta); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/talink_58.c b/lib/dns/rdata/generic/talink_58.c index bf001bc160..1682facae2 100644 --- a/lib/dns/rdata/generic/talink_58.c +++ b/lib/dns/rdata/generic/talink_58.c @@ -216,12 +216,13 @@ freestruct_talink(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_talink(ARGS_ADDLDATA) { + REQUIRE(rdata->type == dns_rdatatype_talink); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_talink); - return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/tkey_249.c b/lib/dns/rdata/generic/tkey_249.c index 4eae9d9094..6ba242789d 100644 --- a/lib/dns/rdata/generic/tkey_249.c +++ b/lib/dns/rdata/generic/tkey_249.c @@ -527,12 +527,13 @@ freestruct_tkey(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_tkey(ARGS_ADDLDATA) { + REQUIRE(rdata->type == dns_rdatatype_tkey); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_tkey); - return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/generic/tlsa_52.c b/lib/dns/rdata/generic/tlsa_52.c index 97ea972cbc..7ec2aaaa67 100644 --- a/lib/dns/rdata/generic/tlsa_52.c +++ b/lib/dns/rdata/generic/tlsa_52.c @@ -289,6 +289,7 @@ additionaldata_tlsa(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_tlsa); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/txt_16.c b/lib/dns/rdata/generic/txt_16.c index 643fb3dbd7..b0f1c0c9aa 100644 --- a/lib/dns/rdata/generic/txt_16.c +++ b/lib/dns/rdata/generic/txt_16.c @@ -231,6 +231,7 @@ additionaldata_txt(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_txt); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/uri_256.c b/lib/dns/rdata/generic/uri_256.c index ae53d85c4b..b66b583423 100644 --- a/lib/dns/rdata/generic/uri_256.c +++ b/lib/dns/rdata/generic/uri_256.c @@ -268,6 +268,7 @@ additionaldata_uri(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_uri); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/x25_19.c b/lib/dns/rdata/generic/x25_19.c index 0ba32d582f..ec27cecae6 100644 --- a/lib/dns/rdata/generic/x25_19.c +++ b/lib/dns/rdata/generic/x25_19.c @@ -182,6 +182,7 @@ additionaldata_x25(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_x25); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/generic/zonemd_63.c b/lib/dns/rdata/generic/zonemd_63.c index 8bb2478e35..e4dae5548e 100644 --- a/lib/dns/rdata/generic/zonemd_63.c +++ b/lib/dns/rdata/generic/zonemd_63.c @@ -300,6 +300,7 @@ additionaldata_zonemd(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_zonemd); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/hs_4/a_1.c b/lib/dns/rdata/hs_4/a_1.c index 6a4c1a53bf..1df54fc6f6 100644 --- a/lib/dns/rdata/hs_4/a_1.c +++ b/lib/dns/rdata/hs_4/a_1.c @@ -182,6 +182,7 @@ additionaldata_hs_a(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_hs); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/a6_38.c b/lib/dns/rdata/in_1/a6_38.c index 377c4ec82f..5828ddb39c 100644 --- a/lib/dns/rdata/in_1/a6_38.c +++ b/lib/dns/rdata/in_1/a6_38.c @@ -401,6 +401,7 @@ additionaldata_in_a6(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/a_1.c b/lib/dns/rdata/in_1/a_1.c index 24e303f257..cf544f0279 100644 --- a/lib/dns/rdata/in_1/a_1.c +++ b/lib/dns/rdata/in_1/a_1.c @@ -186,6 +186,7 @@ additionaldata_in_a(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/aaaa_28.c b/lib/dns/rdata/in_1/aaaa_28.c index d7427a1757..5ac6d649db 100644 --- a/lib/dns/rdata/in_1/aaaa_28.c +++ b/lib/dns/rdata/in_1/aaaa_28.c @@ -198,6 +198,7 @@ additionaldata_in_aaaa(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/apl_42.c b/lib/dns/rdata/in_1/apl_42.c index 50b784c15d..5ba4527b83 100644 --- a/lib/dns/rdata/in_1/apl_42.c +++ b/lib/dns/rdata/in_1/apl_42.c @@ -428,8 +428,10 @@ additionaldata_in_apl(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_apl); REQUIRE(rdata->rdclass == dns_rdataclass_in); - (void)add; - (void)arg; + UNUSED(rdata); + UNUSED(owner); + UNUSED(add); + UNUSED(arg); return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdata/in_1/atma_34.c b/lib/dns/rdata/in_1/atma_34.c index 07a9198e53..11fb203267 100644 --- a/lib/dns/rdata/in_1/atma_34.c +++ b/lib/dns/rdata/in_1/atma_34.c @@ -264,6 +264,7 @@ additionaldata_in_atma(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/dhcid_49.c b/lib/dns/rdata/in_1/dhcid_49.c index 454bf58292..8353e69f10 100644 --- a/lib/dns/rdata/in_1/dhcid_49.c +++ b/lib/dns/rdata/in_1/dhcid_49.c @@ -182,6 +182,7 @@ additionaldata_in_dhcid(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/eid_31.c b/lib/dns/rdata/in_1/eid_31.c index fdab429e50..454ad2d570 100644 --- a/lib/dns/rdata/in_1/eid_31.c +++ b/lib/dns/rdata/in_1/eid_31.c @@ -171,6 +171,7 @@ additionaldata_in_eid(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/https_65.c b/lib/dns/rdata/in_1/https_65.c index 464b58337d..ff562bec6d 100644 --- a/lib/dns/rdata/in_1/https_65.c +++ b/lib/dns/rdata/in_1/https_65.c @@ -14,7 +14,7 @@ #ifndef RDATA_IN_1_HTTPS_65_C #define RDATA_IN_1_HTTPS_65_C -#define RRTYPE_HTTPS_ATTRIBUTES 0 +#define RRTYPE_HTTPS_ATTRIBUTES (DNS_RDATATYPEATTR_FOLLOWADDITIONAL) /* * Most of these functions refer to equivalent functions for SVCB, diff --git a/lib/dns/rdata/in_1/kx_36.c b/lib/dns/rdata/in_1/kx_36.c index 2b47aa919f..bfa8d71771 100644 --- a/lib/dns/rdata/in_1/kx_36.c +++ b/lib/dns/rdata/in_1/kx_36.c @@ -228,12 +228,14 @@ additionaldata_in_kx(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_kx); REQUIRE(rdata->rdclass == dns_rdataclass_in); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); isc_region_consume(®ion, 2); dns_name_fromregion(&name, ®ion); - return ((add)(arg, &name, dns_rdatatype_a)); + return ((add)(arg, &name, dns_rdatatype_a, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/in_1/nimloc_32.c b/lib/dns/rdata/in_1/nimloc_32.c index 751e5a8918..ce4cc5f2af 100644 --- a/lib/dns/rdata/in_1/nimloc_32.c +++ b/lib/dns/rdata/in_1/nimloc_32.c @@ -171,6 +171,7 @@ additionaldata_in_nimloc(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/nsap-ptr_23.c b/lib/dns/rdata/in_1/nsap-ptr_23.c index ea7bd3b6ae..9960ce818c 100644 --- a/lib/dns/rdata/in_1/nsap-ptr_23.c +++ b/lib/dns/rdata/in_1/nsap-ptr_23.c @@ -187,6 +187,7 @@ additionaldata_in_nsap_ptr(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/nsap_22.c b/lib/dns/rdata/in_1/nsap_22.c index fe3361ce51..fa2d3d6d3b 100644 --- a/lib/dns/rdata/in_1/nsap_22.c +++ b/lib/dns/rdata/in_1/nsap_22.c @@ -206,6 +206,7 @@ additionaldata_in_nsap(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/px_26.c b/lib/dns/rdata/in_1/px_26.c index 73d595355e..02faa728bc 100644 --- a/lib/dns/rdata/in_1/px_26.c +++ b/lib/dns/rdata/in_1/px_26.c @@ -308,6 +308,7 @@ additionaldata_in_px(ARGS_ADDLDATA) { REQUIRE(rdata->rdclass == dns_rdataclass_in); UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); diff --git a/lib/dns/rdata/in_1/srv_33.c b/lib/dns/rdata/in_1/srv_33.c index 80dd1d637c..2a299cedf7 100644 --- a/lib/dns/rdata/in_1/srv_33.c +++ b/lib/dns/rdata/in_1/srv_33.c @@ -313,6 +313,8 @@ additionaldata_in_srv(ARGS_ADDLDATA) { REQUIRE(rdata->type == dns_rdatatype_srv); REQUIRE(rdata->rdclass == dns_rdataclass_in); + UNUSED(owner); + dns_name_init(&name, offsets); dns_rdata_toregion(rdata, ®ion); isc_region_consume(®ion, 4); @@ -324,7 +326,7 @@ additionaldata_in_srv(ARGS_ADDLDATA) { return (ISC_R_SUCCESS); } - result = (add)(arg, &name, dns_rdatatype_a); + result = (add)(arg, &name, dns_rdatatype_a, NULL); if (result != ISC_R_SUCCESS) { return (result); } @@ -343,7 +345,8 @@ additionaldata_in_srv(ARGS_ADDLDATA) { return (ISC_R_SUCCESS); } - return ((add)(arg, dns_fixedname_name(&fixed), dns_rdatatype_tlsa)); + return ((add)(arg, dns_fixedname_name(&fixed), dns_rdatatype_tlsa, + NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/in_1/svcb_64.c b/lib/dns/rdata/in_1/svcb_64.c index 8987094aa3..94679f07ae 100644 --- a/lib/dns/rdata/in_1/svcb_64.c +++ b/lib/dns/rdata/in_1/svcb_64.c @@ -14,11 +14,12 @@ #ifndef RDATA_IN_1_SVCB_64_C #define RDATA_IN_1_SVCB_64_C -#define RRTYPE_SVCB_ATTRIBUTES 0 +#define RRTYPE_SVCB_ATTRIBUTES (DNS_RDATATYPEATTR_FOLLOWADDITIONAL) #define SVCB_MAN_KEY 0 #define SVCB_ALPN_KEY 1 #define SVCB_NO_DEFAULT_ALPN_KEY 2 +#define MAX_CNAMES 16 /* See ns/query.c MAX_RESTARTS */ /* * Service Binding Parameter Registry @@ -1064,11 +1065,85 @@ freestruct_in_svcb(ARGS_FREESTRUCT) { static inline isc_result_t generic_additionaldata_in_svcb(ARGS_ADDLDATA) { - UNUSED(rdata); - UNUSED(add); - UNUSED(arg); + bool alias, done = false; + dns_fixedname_t fixed; + dns_name_t name, *fname = NULL; + dns_offsets_t offsets; + dns_rdataset_t rdataset; + isc_region_t region; + unsigned int cnames = 0; - return (ISC_R_SUCCESS); + dns_name_init(&name, offsets); + dns_rdata_toregion(rdata, ®ion); + alias = uint16_fromregion(®ion) == 0; + isc_region_consume(®ion, 2); + + dns_name_fromregion(&name, ®ion); + + if (dns_name_equal(&name, dns_rootname)) { + /* + * "." only means owner name in service form. + */ + if (alias || dns_name_equal(owner, dns_rootname) || + !dns_name_ishostname(owner, false)) + { + return (ISC_R_SUCCESS); + } + /* Only lookup address records */ + return ((add)(arg, owner, dns_rdatatype_a, NULL)); + } + + /* + * Follow CNAME chains when processing HTTPS and SVCB records. + */ + dns_rdataset_init(&rdataset); + fname = dns_fixedname_initname(&fixed); + do { + RETERR((add)(arg, &name, dns_rdatatype_cname, &rdataset)); + if (dns_rdataset_isassociated(&rdataset)) { + isc_result_t result; + result = dns_rdataset_first(&rdataset); + if (result == ISC_R_SUCCESS) { + dns_rdata_t current = DNS_RDATA_INIT; + dns_rdata_cname_t cname; + + dns_rdataset_current(&rdataset, ¤t); + + result = dns_rdata_tostruct(¤t, &cname, + NULL); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + dns_name_copy(&cname.cname, fname); + dns_name_clone(fname, &name); + } else { + done = true; + } + dns_rdataset_disassociate(&rdataset); + } else { + done = true; + } + /* + * Stop following a potentially infinite CNAME chain. + */ + if (!done && cnames++ > MAX_CNAMES) { + return (ISC_R_SUCCESS); + } + } while (!done); + + /* + * Look up HTTPS/SVCB records when processing the alias form. + */ + if (alias) { + RETERR((add)(arg, &name, rdata->type, &rdataset)); + /* + * Don't return A or AAAA if this is not the last element + * in the HTTP / SVCB chain. + */ + if (dns_rdataset_isassociated(&rdataset)) { + dns_rdataset_disassociate(&rdataset); + return (ISC_R_SUCCESS); + } + } + return ((add)(arg, &name, dns_rdatatype_a, NULL)); } static inline isc_result_t diff --git a/lib/dns/rdata/in_1/wks_11.c b/lib/dns/rdata/in_1/wks_11.c index caa3892b64..b837c55920 100644 --- a/lib/dns/rdata/in_1/wks_11.c +++ b/lib/dns/rdata/in_1/wks_11.c @@ -360,13 +360,14 @@ freestruct_in_wks(ARGS_FREESTRUCT) { static inline isc_result_t additionaldata_in_wks(ARGS_ADDLDATA) { - UNUSED(rdata); - UNUSED(add); - UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_wks); REQUIRE(rdata->rdclass == dns_rdataclass_in); + UNUSED(rdata); + UNUSED(owner); + UNUSED(add); + UNUSED(arg); + return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdataset.c b/lib/dns/rdataset.c index 87fda079f9..c51916e7dd 100644 --- a/lib/dns/rdataset.c +++ b/lib/dns/rdataset.c @@ -576,6 +576,7 @@ dns_rdataset_towire(dns_rdataset_t *rdataset, const dns_name_t *owner_name, isc_result_t dns_rdataset_additionaldata(dns_rdataset_t *rdataset, + const dns_name_t *owner_name, dns_additionaldatafunc_t add, void *arg) { dns_rdata_t rdata = DNS_RDATA_INIT; isc_result_t result; @@ -595,7 +596,7 @@ dns_rdataset_additionaldata(dns_rdataset_t *rdataset, do { dns_rdataset_current(rdataset, &rdata); - result = dns_rdata_additionaldata(&rdata, add, arg); + result = dns_rdata_additionaldata(&rdata, owner_name, add, arg); if (result == ISC_R_SUCCESS) { result = dns_rdataset_next(rdataset); } diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index f8b9c4d9a9..0358241d95 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -7026,7 +7026,7 @@ mark_related(dns_name_t *name, dns_rdataset_t *rdataset, bool external, static isc_result_t check_section(void *arg, const dns_name_t *addname, dns_rdatatype_t type, - dns_section_t section) { + dns_rdataset_t *found, dns_section_t section) { respctx_t *rctx = arg; fetchctx_t *fctx = rctx->fctx; isc_result_t result; @@ -7071,6 +7071,9 @@ check_section(void *arg, const dns_name_t *addname, dns_rdatatype_t type, result = dns_message_findtype(name, type, 0, &rdataset); if (result == ISC_R_SUCCESS) { mark_related(name, rdataset, external, gluing); + if (found != NULL) { + dns_rdataset_clone(rdataset, found); + } /* * Do we have its SIG too? */ @@ -7090,8 +7093,10 @@ check_section(void *arg, const dns_name_t *addname, dns_rdatatype_t type, } static isc_result_t -check_related(void *arg, const dns_name_t *addname, dns_rdatatype_t type) { - return (check_section(arg, addname, type, DNS_SECTION_ADDITIONAL)); +check_related(void *arg, const dns_name_t *addname, dns_rdatatype_t type, + dns_rdataset_t *found) { + return (check_section(arg, addname, type, found, + DNS_SECTION_ADDITIONAL)); } #ifndef CHECK_FOR_GLUE_IN_ANSWER @@ -7100,8 +7105,9 @@ check_related(void *arg, const dns_name_t *addname, dns_rdatatype_t type) { #if CHECK_FOR_GLUE_IN_ANSWER static isc_result_t -check_answer(void *arg, const dns_name_t *addname, dns_rdatatype_t type) { - return (check_section(arg, addname, type, DNS_SECTION_ANSWER)); +check_answer(void *arg, const dns_name_t *addname, dns_rdatatype_t type, + dns_rdataset_t *found) { + return (check_section(arg, addname, type, found, DNS_SECTION_ANSWER)); } #endif /* if CHECK_FOR_GLUE_IN_ANSWER */ @@ -8774,8 +8780,8 @@ rctx_answer_any(respctx_t *rctx) { rdataset->attributes |= DNS_RDATASETATTR_CACHE; rdataset->trust = rctx->trust; - (void)dns_rdataset_additionaldata(rdataset, check_related, - rctx); + (void)dns_rdataset_additionaldata(rdataset, rctx->aname, + check_related, rctx); } return (ISC_R_SUCCESS); @@ -8822,7 +8828,8 @@ rctx_answer_match(respctx_t *rctx) { rctx->ardataset->attributes |= DNS_RDATASETATTR_ANSWER; rctx->ardataset->attributes |= DNS_RDATASETATTR_CACHE; rctx->ardataset->trust = rctx->trust; - (void)dns_rdataset_additionaldata(rctx->ardataset, check_related, rctx); + (void)dns_rdataset_additionaldata(rctx->ardataset, rctx->aname, + check_related, rctx); for (sigrdataset = ISC_LIST_HEAD(rctx->aname->list); sigrdataset != NULL; @@ -9030,7 +9037,8 @@ rctx_authority_positive(respctx_t *rctx) { * to this rdataset. */ (void)dns_rdataset_additionaldata( - rdataset, check_related, rctx); + rdataset, name, check_related, + rctx); done = true; } } @@ -9531,8 +9539,8 @@ rctx_referral(respctx_t *rctx) { */ INSIST(rctx->ns_rdataset != NULL); FCTX_ATTR_SET(fctx, FCTX_ATTR_GLUING); - (void)dns_rdataset_additionaldata(rctx->ns_rdataset, check_related, - rctx); + (void)dns_rdataset_additionaldata(rctx->ns_rdataset, rctx->ns_name, + check_related, rctx); #if CHECK_FOR_GLUE_IN_ANSWER /* * Look in the answer section for "glue" that is incorrectly @@ -9544,8 +9552,8 @@ rctx_referral(respctx_t *rctx) { if (rctx->glue_in_answer && (fctx->type == dns_rdatatype_aaaa || fctx->type == dns_rdatatype_a)) { - (void)dns_rdataset_additionaldata(rctx->ns_rdataset, - check_answer, fctx); + (void)dns_rdataset_additionaldata( + rctx->ns_rdataset, rctx->ns_name, check_answer, fctx); } #endif /* if CHECK_FOR_GLUE_IN_ANSWER */ FCTX_ATTR_CLR(fctx, FCTX_ATTR_GLUING); @@ -9655,7 +9663,7 @@ again: if (CHASE(rdataset)) { rdataset->attributes &= ~DNS_RDATASETATTR_CHASE; (void)dns_rdataset_additionaldata( - rdataset, check_related, rctx); + rdataset, name, check_related, rctx); rescan = true; } } diff --git a/lib/dns/tests/rdata_test.c b/lib/dns/tests/rdata_test.c index f283c362ba..5d0fc9cb07 100644 --- a/lib/dns/tests/rdata_test.c +++ b/lib/dns/tests/rdata_test.c @@ -207,10 +207,12 @@ rdata_towire(dns_rdata_t *rdata, unsigned char *dst, size_t dstlen, } static isc_result_t -additionaldata_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype) { +additionaldata_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype, + dns_rdataset_t *found) { UNUSED(arg); UNUSED(name); UNUSED(qtype); + UNUSED(found); return (ISC_R_SUCCESS); } @@ -219,7 +221,8 @@ additionaldata_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype) { */ static isc_result_t rdata_additionadata(dns_rdata_t *rdata) { - return (dns_rdata_additionaldata(rdata, additionaldata_cb, NULL)); + return (dns_rdata_additionaldata(rdata, dns_rootname, additionaldata_cb, + NULL)); } /* diff --git a/lib/ns/client.c b/lib/ns/client.c index 097733474f..9ba1c89992 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -203,6 +203,7 @@ ns_client_endrequest(ns_client_t *client) { client->udpsize = 512; client->extflags = 0; client->ednsversion = -1; + client->additionaldepth = 0; dns_ecs_init(&client->ecs); dns_message_reset(client->message, DNS_MESSAGE_INTENTPARSE); diff --git a/lib/ns/include/ns/client.h b/lib/ns/include/ns/client.h index 974e80dc1b..a99835bd4e 100644 --- a/lib/ns/include/ns/client.h +++ b/lib/ns/include/ns/client.h @@ -195,6 +195,7 @@ struct ns_client { uint16_t udpsize; uint16_t extflags; int16_t ednsversion; /* -1 noedns */ + uint16_t additionaldepth; void (*cleanup)(ns_client_t *); void (*shutdown)(void *arg, isc_result_t result); void * shutdown_arg; diff --git a/lib/ns/query.c b/lib/ns/query.c index 81ff6abfe7..f369c48134 100644 --- a/lib/ns/query.c +++ b/lib/ns/query.c @@ -1649,7 +1649,8 @@ query_additionalauth(query_ctx_t *qctx, const dns_name_t *name, } static isc_result_t -query_additional_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype) { +query_additional_cb(void *arg, const dns_name_t *name, dns_rdatatype_t qtype, + dns_rdataset_t *found) { query_ctx_t *qctx = arg; ns_client_t *client = qctx->client; isc_result_t result, eresult = ISC_R_SUCCESS; @@ -1833,6 +1834,13 @@ found: */ ns_client_keepname(client, fname, dbuf); + /* + * Does the caller want the found rdataset? + */ + if (found != NULL && dns_rdataset_isassociated(rdataset)) { + dns_rdataset_clone(rdataset, found); + } + /* * If we have an rdataset, add it to the additional data * section. @@ -2038,7 +2046,6 @@ addname: dns_message_addname(client->message, fname, DNS_SECTION_ADDITIONAL); } - fname = NULL; /* * In some cases, a record that has been added as additional @@ -2046,10 +2053,18 @@ addname: * This cannot go more than MAX_RESTARTS levels deep. */ if (trdataset != NULL && dns_rdatatype_followadditional(type)) { - eresult = dns_rdataset_additionaldata( - trdataset, query_additional_cb, qctx); + if (client->additionaldepth++ < MAX_RESTARTS) { + eresult = dns_rdataset_additionaldata( + trdataset, fname, query_additional_cb, qctx); + } + client->additionaldepth--; } + /* + * Don't release fname. + */ + fname = NULL; + cleanup: CTRACE(ISC_LOG_DEBUG(3), "query_additional_cb: cleanup"); ns_client_putrdataset(client, &rdataset); @@ -2101,7 +2116,8 @@ query_setorder(query_ctx_t *qctx, dns_name_t *name, dns_rdataset_t *rdataset) { * Handle glue and fetch any other needed additional data for 'rdataset'. */ static void -query_additional(query_ctx_t *qctx, dns_rdataset_t *rdataset) { +query_additional(query_ctx_t *qctx, dns_name_t *name, + dns_rdataset_t *rdataset) { ns_client_t *client = qctx->client; isc_result_t result; @@ -2138,7 +2154,8 @@ regular: * Add other additional data if needed. * We don't care if dns_rdataset_additionaldata() fails. */ - (void)dns_rdataset_additionaldata(rdataset, query_additional_cb, qctx); + (void)dns_rdataset_additionaldata(rdataset, name, query_additional_cb, + qctx); CTRACE(ISC_LOG_DEBUG(3), "query_additional: done"); } @@ -2219,7 +2236,7 @@ query_addrrset(query_ctx_t *qctx, dns_name_t **namep, */ query_addtoname(mname, rdataset); query_setorder(qctx, mname, rdataset); - query_additional(qctx, rdataset); + query_additional(qctx, mname, rdataset); /* * Note: we only add SIGs if we've added the type they cover, so