From cd985d96e324c5be6300ac84322a8b48f5ede506 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 5 Jul 2019 16:20:20 +1000 Subject: [PATCH] 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. --- .../system/resolver/ns6/example.net.db.in | 11 +++ bin/tests/system/resolver/ns6/named.conf.in | 1 + bin/tests/system/resolver/ns7/named1.conf.in | 1 + bin/tests/system/resolver/ns7/named2.conf.in | 1 + bin/tests/system/resolver/tests.sh | 44 ++++++++++ lib/dns/gen.c | 2 +- lib/dns/include/dns/rdata.h | 4 +- lib/dns/include/dns/rdataset.h | 1 + lib/dns/include/dns/types.h | 3 +- lib/dns/rbtdb.c | 8 +- lib/dns/rdata.c | 13 +-- lib/dns/rdata/any_255/tsig_250.c | 1 + lib/dns/rdata/ch_3/a_1.c | 1 + lib/dns/rdata/generic/afsdb_18.c | 4 +- lib/dns/rdata/generic/amtrelay_260.c | 1 + lib/dns/rdata/generic/avc_258.c | 1 + lib/dns/rdata/generic/caa_257.c | 1 + lib/dns/rdata/generic/cdnskey_60.c | 1 + lib/dns/rdata/generic/cds_59.c | 1 + lib/dns/rdata/generic/cert_37.c | 1 + lib/dns/rdata/generic/cname_5.c | 1 + lib/dns/rdata/generic/csync_62.c | 1 + lib/dns/rdata/generic/dlv_32769.c | 1 + lib/dns/rdata/generic/dname_39.c | 5 +- lib/dns/rdata/generic/dnskey_48.c | 1 + lib/dns/rdata/generic/doa_259.c | 5 +- lib/dns/rdata/generic/ds_43.c | 1 + lib/dns/rdata/generic/eui48_108.c | 1 + lib/dns/rdata/generic/eui64_109.c | 1 + lib/dns/rdata/generic/gpos_27.c | 1 + lib/dns/rdata/generic/hinfo_13.c | 3 +- lib/dns/rdata/generic/hip_55.c | 5 +- lib/dns/rdata/generic/ipseckey_45.c | 1 + lib/dns/rdata/generic/isdn_20.c | 1 + lib/dns/rdata/generic/key_25.c | 1 + lib/dns/rdata/generic/keydata_65533.c | 1 + lib/dns/rdata/generic/l32_105.c | 1 + lib/dns/rdata/generic/l64_106.c | 1 + lib/dns/rdata/generic/loc_29.c | 1 + lib/dns/rdata/generic/lp_107.c | 6 +- lib/dns/rdata/generic/mb_7.c | 4 +- lib/dns/rdata/generic/md_3.c | 4 +- lib/dns/rdata/generic/mf_4.c | 4 +- lib/dns/rdata/generic/mg_8.c | 1 + lib/dns/rdata/generic/minfo_14.c | 1 + lib/dns/rdata/generic/mr_9.c | 1 + lib/dns/rdata/generic/mx_15.c | 7 +- lib/dns/rdata/generic/naptr_35.c | 4 +- lib/dns/rdata/generic/nid_104.c | 1 + lib/dns/rdata/generic/ninfo_56.c | 1 + lib/dns/rdata/generic/ns_2.c | 4 +- lib/dns/rdata/generic/nsec3_50.c | 1 + lib/dns/rdata/generic/nsec3param_51.c | 1 + lib/dns/rdata/generic/nsec_47.c | 1 + lib/dns/rdata/generic/null_10.c | 5 +- lib/dns/rdata/generic/nxt_30.c | 1 + lib/dns/rdata/generic/openpgpkey_61.c | 1 + lib/dns/rdata/generic/opt_41.c | 1 + lib/dns/rdata/generic/proforma.c | 5 +- lib/dns/rdata/generic/ptr_12.c | 1 + lib/dns/rdata/generic/rkey_57.c | 1 + lib/dns/rdata/generic/rp_17.c | 1 + lib/dns/rdata/generic/rrsig_46.c | 1 + lib/dns/rdata/generic/rt_21.c | 8 +- lib/dns/rdata/generic/sig_24.c | 1 + lib/dns/rdata/generic/sink_40.c | 1 + lib/dns/rdata/generic/smimea_53.c | 1 + lib/dns/rdata/generic/soa_6.c | 5 +- lib/dns/rdata/generic/spf_99.c | 1 + lib/dns/rdata/generic/sshfp_44.c | 1 + lib/dns/rdata/generic/ta_32768.c | 1 + lib/dns/rdata/generic/talink_58.c | 5 +- lib/dns/rdata/generic/tkey_249.c | 5 +- lib/dns/rdata/generic/tlsa_52.c | 1 + lib/dns/rdata/generic/txt_16.c | 1 + lib/dns/rdata/generic/uri_256.c | 1 + lib/dns/rdata/generic/x25_19.c | 1 + lib/dns/rdata/generic/zonemd_63.c | 1 + lib/dns/rdata/hs_4/a_1.c | 1 + lib/dns/rdata/in_1/a6_38.c | 1 + lib/dns/rdata/in_1/a_1.c | 1 + lib/dns/rdata/in_1/aaaa_28.c | 1 + lib/dns/rdata/in_1/apl_42.c | 6 +- lib/dns/rdata/in_1/atma_34.c | 1 + lib/dns/rdata/in_1/dhcid_49.c | 1 + lib/dns/rdata/in_1/eid_31.c | 1 + lib/dns/rdata/in_1/https_65.c | 2 +- lib/dns/rdata/in_1/kx_36.c | 4 +- lib/dns/rdata/in_1/nimloc_32.c | 1 + lib/dns/rdata/in_1/nsap-ptr_23.c | 1 + lib/dns/rdata/in_1/nsap_22.c | 1 + lib/dns/rdata/in_1/px_26.c | 1 + lib/dns/rdata/in_1/srv_33.c | 7 +- lib/dns/rdata/in_1/svcb_64.c | 85 +++++++++++++++++-- lib/dns/rdata/in_1/wks_11.c | 9 +- lib/dns/rdataset.c | 3 +- lib/dns/resolver.c | 36 +++++--- lib/dns/tests/rdata_test.c | 7 +- lib/ns/client.c | 1 + lib/ns/include/ns/client.h | 1 + lib/ns/query.c | 31 +++++-- 101 files changed, 349 insertions(+), 80 deletions(-) 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