From: Mark Andrews Date: Fri, 5 Jul 2019 06:20:20 +0000 (+1000) Subject: Add additional processing to HTTPS and SVBC records X-Git-Tag: v9.17.18~34^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cd985d96e324c5be6300ac84322a8b48f5ede506;p=thirdparty%2Fbind9.git Add additional processing to HTTPS and SVBC records The additional processing method has been expanded to take the owner name of the record, as HTTPS and SVBC need it to process "." in service form. The additional section callback can now return the RRset that was added. We use this when adding CNAMEs. Previously, the recursion would stop if it detected that a record you added already exists. With CNAMEs this rule doesn't work, as you ultimately care about the RRset at the target of the CNAME and not the presence of the CNAME itself. Returning the record allows the caller to restart with the target name. As CNAMEs can form loops, loop protection was added. As HTTPS and SVBC can produce infinite chains, we prevent this by tracking recursion depth and stopping if we go too deep. --- diff --git a/bin/tests/system/resolver/ns6/example.net.db.in b/bin/tests/system/resolver/ns6/example.net.db.in index eab3267b79d..e3699c18899 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 1726d5fa5b9..5c631ae1110 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 47ce301e860..ec4ade0c51a 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 47ce301e860..ec4ade0c51a 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 435501c2a4c..165b196b70a 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 2939c175e75..09b877e6ff2 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 476ef5f9c70..245b69b29c8 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 2569e40d23a..f5a4f2be355 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 21ced9e4e6f..f42bd80cd72 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 32355c1398f..3b5035ea349 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 29e472c266e..a655233204d 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 0fb1211d13b..083bde33458 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 23163a0e50d..0df83160cb8 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 7fe396c7c5a..d2b84b7273b 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 4e200049dec..1cd8d1dd92f 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 c269f01e4f2..5f3de214be4 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 60c95a5a812..b443aa7d13c 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 2fb006a31a4..9eea7d6b8cf 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 56a847be599..26cc70d4276 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 8a171f8a4ff..34f5ef7c9f7 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 69c28902fc3..aa45ad37139 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 66c37a6f16e..eb41bcb640b 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 3b996adb1bc..21ae76df86d 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 468a6e8a60c..6964249b2e4 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 1aa3f532e41..ca557bf59db 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 c8a735b1807..5de79296c04 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 bbfd136a681..0b91301c315 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 7be59c2c692..1a9820bbeea 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 381b87bbb84..50220c5199d 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 d719fcc5e10..8bdfbdaae1a 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 2d5ed3e338f..2e8a032bded 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 9ead94ed4bb..77d774e37be 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 d93f3e4ab99..54040392169 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 264c7a07240..3054590d7c4 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 5867beee357..1351bfdd23a 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 6c78c98a1f2..ae8d438e2e8 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 b887285eb52..b2f02df6468 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 c225b0f6efe..6ff8fa83bd3 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 478723ae6c2..8c8afc374c9 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 ed4cd199e38..7164394aac1 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 9a037cc7baa..0702fbe490d 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 78c36f92ef9..cff5e91c3c9 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 8d2c2b84823..13b63561fee 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 0b60c909514..efaa0a34be7 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 7394e3f2927..62b5897bc62 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 295cf6ed1ab..62053583135 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 9bddb45ee09..2b5fe03f54e 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 04bb8e05a83..d8de8e9defc 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 d05a42ca300..d8f9afa8155 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 0e74d522f00..a14356c0c7f 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 45a760c6160..21ed02349e7 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 e1eab66d5a9..8f62a61533b 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 1cc56e5ae20..db3a97413ca 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 004d1630899..f7e4693c331 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 f495d56a72e..f13d052e249 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 4065204fe1e..d713f0192a1 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 7077eac71d0..8c4bec53e47 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 7dbb3703867..6d6a127eaf6 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 7913d661628..1db5d9e4694 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 188676a6606..bf689eb7c0b 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 7dd11a29e48..afa294daae3 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 70c3204d237..a44a2321ed0 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 40506d7ed61..e6ef8725d14 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 e54d02970ae..08fb097bf3b 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 bfff78c6637..fc9279eebeb 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 09bb04fab43..5d85652d9cf 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 8871369d9e0..dd3894b30de 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 c30b079b58d..c9fbc10afee 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 4687324e30b..29d5c54fa5e 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 9c604c1380f..8c91d8fbcce 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 93e095d4acb..69875c36ab5 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 bf001bc160a..1682facae22 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 4eae9d90942..6ba242789de 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 97ea972cbc1..7ec2aaaa678 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 643fb3dbd7e..b0f1c0c9aa0 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 ae53d85c4b6..b66b5834232 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 0ba32d582f8..ec27cecae60 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 8bb2478e359..e4dae5548e9 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 6a4c1a53bf5..1df54fc6f66 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 377c4ec82fd..5828ddb39c1 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 24e303f2578..cf544f02794 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 d7427a1757b..5ac6d649db1 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 50b784c15de..5ba4527b830 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 07a9198e53b..11fb2032679 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 454bf582920..8353e69f104 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 fdab429e50f..454ad2d570b 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 464b58337de..ff562bec6da 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 2b47aa919fa..bfa8d717713 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 751e5a8918e..ce4cc5f2af9 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 ea7bd3b6ae8..9960ce818ca 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 fe3361ce51b..fa2d3d6d3b1 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 73d595355ea..02faa728bc0 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 80dd1d637c7..2a299cedf70 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 8987094aa3f..94679f07ae7 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 caa3892b643..b837c559201 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) { + REQUIRE(rdata->type == dns_rdatatype_wks); + REQUIRE(rdata->rdclass == dns_rdataclass_in); + UNUSED(rdata); + UNUSED(owner); UNUSED(add); UNUSED(arg); - REQUIRE(rdata->type == dns_rdatatype_wks); - REQUIRE(rdata->rdclass == dns_rdataclass_in); - return (ISC_R_SUCCESS); } diff --git a/lib/dns/rdataset.c b/lib/dns/rdataset.c index 87fda079f98..c51916e7dd0 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 f8b9c4d9a97..0358241d954 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 f283c362ba6..5d0fc9cb07e 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 097733474fb..9ba1c899925 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 974e80dc1b4..a99835bd4e5 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 81ff6abfe76..f369c481349 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