]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add additional processing to HTTPS and SVBC records
authorMark Andrews <marka@isc.org>
Fri, 5 Jul 2019 06:20:20 +0000 (16:20 +1000)
committerMark Andrews <marka@isc.org>
Wed, 18 Aug 2021 03:49:48 +0000 (13:49 +1000)
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.

101 files changed:
bin/tests/system/resolver/ns6/example.net.db.in
bin/tests/system/resolver/ns6/named.conf.in
bin/tests/system/resolver/ns7/named1.conf.in
bin/tests/system/resolver/ns7/named2.conf.in
bin/tests/system/resolver/tests.sh
lib/dns/gen.c
lib/dns/include/dns/rdata.h
lib/dns/include/dns/rdataset.h
lib/dns/include/dns/types.h
lib/dns/rbtdb.c
lib/dns/rdata.c
lib/dns/rdata/any_255/tsig_250.c
lib/dns/rdata/ch_3/a_1.c
lib/dns/rdata/generic/afsdb_18.c
lib/dns/rdata/generic/amtrelay_260.c
lib/dns/rdata/generic/avc_258.c
lib/dns/rdata/generic/caa_257.c
lib/dns/rdata/generic/cdnskey_60.c
lib/dns/rdata/generic/cds_59.c
lib/dns/rdata/generic/cert_37.c
lib/dns/rdata/generic/cname_5.c
lib/dns/rdata/generic/csync_62.c
lib/dns/rdata/generic/dlv_32769.c
lib/dns/rdata/generic/dname_39.c
lib/dns/rdata/generic/dnskey_48.c
lib/dns/rdata/generic/doa_259.c
lib/dns/rdata/generic/ds_43.c
lib/dns/rdata/generic/eui48_108.c
lib/dns/rdata/generic/eui64_109.c
lib/dns/rdata/generic/gpos_27.c
lib/dns/rdata/generic/hinfo_13.c
lib/dns/rdata/generic/hip_55.c
lib/dns/rdata/generic/ipseckey_45.c
lib/dns/rdata/generic/isdn_20.c
lib/dns/rdata/generic/key_25.c
lib/dns/rdata/generic/keydata_65533.c
lib/dns/rdata/generic/l32_105.c
lib/dns/rdata/generic/l64_106.c
lib/dns/rdata/generic/loc_29.c
lib/dns/rdata/generic/lp_107.c
lib/dns/rdata/generic/mb_7.c
lib/dns/rdata/generic/md_3.c
lib/dns/rdata/generic/mf_4.c
lib/dns/rdata/generic/mg_8.c
lib/dns/rdata/generic/minfo_14.c
lib/dns/rdata/generic/mr_9.c
lib/dns/rdata/generic/mx_15.c
lib/dns/rdata/generic/naptr_35.c
lib/dns/rdata/generic/nid_104.c
lib/dns/rdata/generic/ninfo_56.c
lib/dns/rdata/generic/ns_2.c
lib/dns/rdata/generic/nsec3_50.c
lib/dns/rdata/generic/nsec3param_51.c
lib/dns/rdata/generic/nsec_47.c
lib/dns/rdata/generic/null_10.c
lib/dns/rdata/generic/nxt_30.c
lib/dns/rdata/generic/openpgpkey_61.c
lib/dns/rdata/generic/opt_41.c
lib/dns/rdata/generic/proforma.c
lib/dns/rdata/generic/ptr_12.c
lib/dns/rdata/generic/rkey_57.c
lib/dns/rdata/generic/rp_17.c
lib/dns/rdata/generic/rrsig_46.c
lib/dns/rdata/generic/rt_21.c
lib/dns/rdata/generic/sig_24.c
lib/dns/rdata/generic/sink_40.c
lib/dns/rdata/generic/smimea_53.c
lib/dns/rdata/generic/soa_6.c
lib/dns/rdata/generic/spf_99.c
lib/dns/rdata/generic/sshfp_44.c
lib/dns/rdata/generic/ta_32768.c
lib/dns/rdata/generic/talink_58.c
lib/dns/rdata/generic/tkey_249.c
lib/dns/rdata/generic/tlsa_52.c
lib/dns/rdata/generic/txt_16.c
lib/dns/rdata/generic/uri_256.c
lib/dns/rdata/generic/x25_19.c
lib/dns/rdata/generic/zonemd_63.c
lib/dns/rdata/hs_4/a_1.c
lib/dns/rdata/in_1/a6_38.c
lib/dns/rdata/in_1/a_1.c
lib/dns/rdata/in_1/aaaa_28.c
lib/dns/rdata/in_1/apl_42.c
lib/dns/rdata/in_1/atma_34.c
lib/dns/rdata/in_1/dhcid_49.c
lib/dns/rdata/in_1/eid_31.c
lib/dns/rdata/in_1/https_65.c
lib/dns/rdata/in_1/kx_36.c
lib/dns/rdata/in_1/nimloc_32.c
lib/dns/rdata/in_1/nsap-ptr_23.c
lib/dns/rdata/in_1/nsap_22.c
lib/dns/rdata/in_1/px_26.c
lib/dns/rdata/in_1/srv_33.c
lib/dns/rdata/in_1/svcb_64.c
lib/dns/rdata/in_1/wks_11.c
lib/dns/rdataset.c
lib/dns/resolver.c
lib/dns/tests/rdata_test.c
lib/ns/client.c
lib/ns/include/ns/client.h
lib/ns/query.c

index eab3267b79d367e7b6eb82378d7af40d830a524f..e3699c188991fdc91b00c5ceb345531c4926f43d 100644 (file)
@@ -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
index 1726d5fa5b94c7c2a2fe31a1d1aeb1a3a2bca33c..5c631ae1110071601534922c56f0a6f7b2e54462 100644 (file)
@@ -28,6 +28,7 @@ options {
         * has a exclude list.
         */
        root-delegation-only exclude { "a"; };
+       max-udp-size 4096;
 };
 
 zone "." {
index 47ce301e860f0f7cc7df76a65fdeda78fac6dd45..ec4ade0c51a114d35f73bb45d646c6d162120b01 100644 (file)
@@ -29,6 +29,7 @@ options {
         */
        prefetch 0;
        querylog yes;
+       edns-udp-size 4096;
 };
 
 key rndc_key {
index 47ce301e860f0f7cc7df76a65fdeda78fac6dd45..ec4ade0c51a114d35f73bb45d646c6d162120b01 100644 (file)
@@ -29,6 +29,7 @@ options {
         */
        prefetch 0;
        querylog yes;
+       edns-udp-size 4096;
 };
 
 key rndc_key {
index 435501c2a4c3c2683ca5e459025a55a8857f8d68..165b196b70a155cfc05a5376703ce0a2cf9b5f55 100755 (executable)
@@ -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
index 2939c175e751b48e1ef755c7e13ca8adc6037de2..09b877e6ff2bf503cd3923019496c06040b66401 100644 (file)
@@ -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"
index 476ef5f9c70f96bf112962a996f9c031f2aa8465..245b69b29c8958f99b4f6b03700a73d889460060 100644 (file)
@@ -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.
index 2569e40d23a4622d72ea938a650f450d50e0b86a..f5a4f2be35592fd701953af8c0f3e8cdaa786d7d 100644 (file)
@@ -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
index 21ced9e4e6fbc6f6f5fb99e052e43c89d1988810..f42bd80cd728e84879de7d09e42eae9b61f59b88 100644 (file)
@@ -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 *);
 
index 32355c1398f5fdce5890ad5d46325c9bfdaf5815..3b5035ea349e9c751b8e6a6682084dc5561da95b 100644 (file)
@@ -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));
 
index 29e472c266e416d1d619dd14ecab980eef3db2e7..a655233204d42d7e7975bf3b5637889c84674fbe 100644 (file)
 #include <dns/compress.h>
 #include <dns/dsdigest.h>
 #include <dns/enumtype.h>
+#include <dns/fixedname.h>
 #include <dns/keyflags.h>
 #include <dns/keyvalues.h>
 #include <dns/message.h>
 #include <dns/rcode.h>
 #include <dns/rdata.h>
 #include <dns/rdataclass.h>
+#include <dns/rdataset.h>
 #include <dns/rdatastruct.h>
 #include <dns/rdatatype.h>
 #include <dns/result.h>
 
 #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;
 
index 0fb1211d13b32e706bc3dabdc3d52f93d3228120..083bde33458e821c5555f3c8e64c56eaa99f5534 100644 (file)
@@ -567,6 +567,7 @@ additionaldata_any_tsig(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_any);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 23163a0e50d388e6099079221bee8ef69fa11523..0df83160cb87e8ee39f369747bf663df9ae2dbd8 100644 (file)
@@ -261,6 +261,7 @@ additionaldata_ch_a(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_ch);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 7fe396c7c5af5f52a2f10e6d299dfe9e9cd89a18..d2b84b7273b8b3c0814181bd16bd9cecda444da2 100644 (file)
@@ -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, &region);
        isc_region_consume(&region, 2);
        dns_name_fromregion(&name, &region);
 
-       return ((add)(arg, &name, dns_rdatatype_a));
+       return ((add)(arg, &name, dns_rdatatype_a, NULL));
 }
 
 static inline isc_result_t
index 4e200049dec2ec9a0c894f5bebcc1f4328a46d5f..1cd8d1dd92f5833033a537fdf94e59f76fb11124 100644 (file)
@@ -395,6 +395,7 @@ additionaldata_amtrelay(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_amtrelay);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index c269f01e4f20b57045231697930e037a58fc3823..5f3de214be4a93035f785be0077d8f2c36108d76 100644 (file)
@@ -95,6 +95,7 @@ additionaldata_avc(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_avc);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 60c95a5a812257e2f0847b6887b6fef93510ed37..b443aa7d13c54964f7f244c34beb1e6da8a119b0 100644 (file)
@@ -572,6 +572,7 @@ additionaldata_caa(ARGS_ADDLDATA) {
        REQUIRE(rdata->length >= 3U);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 2fb006a31a4e1a42402001574e4975e9f4fdcdfd..9eea7d6b8cf15efd18da3cbc44a424cd63cf720d 100644 (file)
@@ -108,6 +108,7 @@ additionaldata_cdnskey(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_cdnskey);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 56a847be5991dc480c74dd8c711827eb5766fd83..26cc70d42761653961f59729f92879cbbf7bc6d1 100644 (file)
@@ -116,6 +116,7 @@ additionaldata_cds(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_cds);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 8a171f8a4ff0613658873e765cd3b2c234945c4d..34f5ef7c9f71be6c8895ed19866ebb0758d1f485 100644 (file)
@@ -235,6 +235,7 @@ additionaldata_cert(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_cert);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 69c28902fc34b1f55c17fd154c985de94fceefe5..aa45ad371399a7e1d5717cea5503384764382963 100644 (file)
@@ -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);
 
index 66c37a6f16e781aa52044701adcb9db791f5494c..eb41bcb640b551444509ecfd9bed8f26d1d8970e 100644 (file)
@@ -214,6 +214,7 @@ additionaldata_csync(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_csync);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 3b996adb1bc7ed1947f3599602700c97c8e13c3e..21ae76df86d0b1bd3a2a7bfb9de96b5c300c0415 100644 (file)
@@ -112,6 +112,7 @@ additionaldata_dlv(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_dlv);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 468a6e8a60c8bcdef063c49c10c0345fad1bc34e..6964249b2e4a8cda1b49fcb4a00fa576f3a9ea58 100644 (file)
@@ -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);
 }
 
index 1aa3f532e41053c41f781e81bff1a851310d93a5..ca557bf59dbe99b422a44e42e23b0235a269ff94 100644 (file)
@@ -109,6 +109,7 @@ additionaldata_dnskey(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_dnskey);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index c8a735b1807a4438f6a95eb233f3150182cd6738..5de79296c042a601285cbd178780e4fff1d8f69e 100644 (file)
@@ -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);
 }
 
index bbfd136a681d90fd80c910087f70d1db28104e7f..0b91301c3152e46e6f8960a0bed8088debf9a6d0 100644 (file)
@@ -335,6 +335,7 @@ additionaldata_ds(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_ds);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 7be59c2c692c392efd008fc81db49e1eab4ac2ab..1a9820bbeeadcb345c6bd207a4977acfba995e1f 100644 (file)
@@ -159,6 +159,7 @@ additionaldata_eui48(ARGS_ADDLDATA) {
        REQUIRE(rdata->length == 6);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 381b87bbb84a118d2462bd94091bac031b9f90dc..50220c5199d7fdd68af653b8774a31cb272e8d8b 100644 (file)
@@ -162,6 +162,7 @@ additionaldata_eui64(ARGS_ADDLDATA) {
        REQUIRE(rdata->length == 8);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index d719fcc5e103ad576eb7c87804bfc843e0718127..8bdfbdaae1a83d07579a288f0f50fdfafdfc0684 100644 (file)
@@ -205,6 +205,7 @@ additionaldata_gpos(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_gpos);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 2d5ed3e338f64c37ebb4f08930a0c1ad61300e44..2e8a032bded59a05713107526ea9439e3a56d0b4 100644 (file)
@@ -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);
 }
index 9ead94ed4bbbac2097cc6668bb45d6afbc5efdd6..77d774e37be9f766b9123314324b7b45a352becf 100644 (file)
@@ -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);
 }
 
index d93f3e4ab9932ed5270345563bd1904452b2a769..54040392169b2cc872d0ef915193f8617453b70d 100644 (file)
@@ -440,6 +440,7 @@ additionaldata_ipseckey(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_ipseckey);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 264c7a072404df7cdd9d3682018e2927a779d15e..3054590d7c49aef902a27e10ca463935986082a4 100644 (file)
@@ -196,6 +196,7 @@ additionaldata_isdn(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_isdn);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 5867beee35769d09dff8e49670236ac250d592ef..1351bfdd23ac8661e9888414b670d193ff655167 100644 (file)
@@ -415,6 +415,7 @@ additionaldata_key(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_key);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 6c78c98a1f2493243e4bffaa99cdcf46e3b82b66..ae8d438e2e8b81c7d2d72a8f0ccdba1ffe3bdada 100644 (file)
@@ -412,6 +412,7 @@ additionaldata_keydata(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_keydata);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index b887285eb5297398db2192d1d1e3aa15bcd880ff..b2f02df64680ff3015a8fe024563b382169971a4 100644 (file)
@@ -178,6 +178,7 @@ additionaldata_l32(ARGS_ADDLDATA) {
        REQUIRE(rdata->length == 6);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index c225b0f6efef9a33ee390cfdc3a86b4fafac36ff..6ff8fa83bd3d112d4a6e06e25ec796b53ed8181d 100644 (file)
@@ -172,6 +172,7 @@ additionaldata_l64(ARGS_ADDLDATA) {
        REQUIRE(rdata->length == 10);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 478723ae6c290db39224b553719f69e89df68243..8c8afc374c9571c686d598e3f94ff11416e3cb13 100644 (file)
@@ -785,6 +785,7 @@ additionaldata_loc(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_loc);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index ed4cd199e3832ed3df527ea5cf8cfe3657856923..7164394aac1af159bfedcb84dff91814f27b5eda 100644 (file)
@@ -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, &region);
        isc_region_consume(&region, 2);
        dns_name_fromregion(&name, &region);
 
-       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
index 9a037cc7baa855bc30b79809470ae60c34532d9f..0702fbe490dab6e6d43ab49c4b4175979d565747 100644 (file)
@@ -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, &region);
        dns_name_fromregion(&name, &region);
 
-       return ((add)(arg, &name, dns_rdatatype_a));
+       return ((add)(arg, &name, dns_rdatatype_a, NULL));
 }
 
 static inline isc_result_t
index 78c36f92ef9f574769a3f678323b88f02569d197..cff5e91c3c92becfce25314d7a80a9ac4382e825 100644 (file)
@@ -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, &region);
        dns_name_fromregion(&name, &region);
 
-       return ((add)(arg, &name, dns_rdatatype_a));
+       return ((add)(arg, &name, dns_rdatatype_a, NULL));
 }
 
 static inline isc_result_t
index 8d2c2b8482343e8a46efa8e37ff1ba3ff2700d16..13b63561fee54d8d80d5f5833d21a408a32d04b8 100644 (file)
@@ -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, &region);
        dns_name_fromregion(&name, &region);
 
-       return ((add)(arg, &name, dns_rdatatype_a));
+       return ((add)(arg, &name, dns_rdatatype_a, NULL));
 }
 
 static inline isc_result_t
index 0b60c9095148a63cee617770ad2e9c04958d91fa..efaa0a34be7db415da9dee1fa019e056742da5e0 100644 (file)
@@ -178,6 +178,7 @@ additionaldata_mg(ARGS_ADDLDATA) {
        UNUSED(add);
        UNUSED(arg);
        UNUSED(rdata);
+       UNUSED(owner);
 
        return (ISC_R_SUCCESS);
 }
index 7394e3f2927a51e9de7b3adfac8d9d14cb035c10..62b5897bc62914f2f1f1548cb0b3b47409300e0f 100644 (file)
@@ -253,6 +253,7 @@ additionaldata_minfo(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_minfo);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 295cf6ed1ab79cca33700b91917a1478927f00a7..62053583135e5eb16248879e3a6007bc4787fff3 100644 (file)
@@ -176,6 +176,7 @@ additionaldata_mr(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_mr);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 9bddb45ee094a207ac907e35009965f625160ce3..2b5fe03f54e3697c827b391517a8356b728a31ab 100644 (file)
@@ -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, &region);
        isc_region_consume(&region, 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
index 04bb8e05a83a51307c1abc26f04f0e4b5c48a3ce..d8de8e9defc8d4b338ad22a0f00e96ec8b687ec7 100644 (file)
@@ -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);
index d05a42ca3009d4693372db3bbe6b52af75f5f2f7..d8f9afa81555d12eb7d62c69f6a77d8d5f61e692 100644 (file)
@@ -172,6 +172,7 @@ additionaldata_nid(ARGS_ADDLDATA) {
        REQUIRE(rdata->length == 10);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 0e74d522f007f8eef058fefea8e0c982bda8b678..a14356c0c7fd62650f10b085de8a189168303b06 100644 (file)
@@ -95,6 +95,7 @@ additionaldata_ninfo(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_ninfo);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 45a760c616015e61aa64984fc6f78ebc89e792ef..21ed02349e77f27197576f0add6dc2f1dd8befef 100644 (file)
@@ -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, &region);
        dns_name_fromregion(&name, &region);
 
-       return ((add)(arg, &name, dns_rdatatype_a));
+       return ((add)(arg, &name, dns_rdatatype_a, NULL));
 }
 
 static inline isc_result_t
index e1eab66d5a989f364e9f80817b6db4a012011ee9..8f62a61533b4e76e7b57ad4d41a03e4b8a33bac2 100644 (file)
@@ -362,6 +362,7 @@ additionaldata_nsec3(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_nsec3);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 1cc56e5ae204c52f1b2b175e8aae6e4fb8b651d6..db3a97413cabd4b79a72b2bb34ec78cbda8d8bd2 100644 (file)
@@ -272,6 +272,7 @@ additionaldata_nsec3param(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_nsec3param);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 004d1630899b5021849be49d2146852306ded465..f7e4693c33167fc3bafcd942e25c8c595a99f4b1 100644 (file)
@@ -213,6 +213,7 @@ additionaldata_nsec(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_nsec);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index f495d56a72ea192bb78441d204b8146b3db39c63..f13d052e24902f798cd2a62f21248367b06f46f1 100644 (file)
@@ -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);
 }
 
index 4065204fe1e06ac750dd0fca3fc0922885470d91..d713f0192a16decd475acdf6e15b9382a9852b97 100644 (file)
@@ -292,6 +292,7 @@ additionaldata_nxt(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_nxt);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 7077eac71d0b6d7140c6058f04a2ffe92827129f..8c4bec53e47c5ea1c3059fa2ff874fa46a6071c4 100644 (file)
@@ -187,6 +187,7 @@ additionaldata_openpgpkey(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_openpgpkey);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 7dbb3703867310a0b6baff39835d1902b504bf9c..6d6a127eaf657a13f2a9b14fb37a45125dc8ae26 100644 (file)
@@ -359,6 +359,7 @@ additionaldata_opt(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_opt);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 7913d661628e1e5df5ff1c0b3b66238f63b4aa0c..1db5d9e469492539ce39e20f75dcdcba76e7e157 100644 (file)
@@ -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);
 }
index 188676a660695ec9c9427b4903196e22e48a2dcc..bf689eb7c0b45d333b7404d299d7cd7c5c76f086 100644 (file)
@@ -190,6 +190,7 @@ additionaldata_ptr(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_ptr);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 7dd11a29e48a58348307dc4220c968281b30f238..afa294daae3d185b1a43d4b9cd2cf4564684691c 100644 (file)
@@ -105,6 +105,7 @@ additionaldata_rkey(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_rkey);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 70c3204d237c211c3d4b999ea583b64e218f43f5..a44a2321ed086b0ede5366d9d7e2b78ce0cd6bbe 100644 (file)
@@ -252,6 +252,7 @@ additionaldata_rp(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_rp);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 40506d7ed61f1e1673e428c146f2dc8d104eafdd..e6ef8725d147b5a9a2ae0509e024f0e74d1e7f9d 100644 (file)
@@ -536,6 +536,7 @@ additionaldata_rrsig(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_rrsig);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index e54d02970aeb6e1cdcb9c21fbb00b312456e2b97..08fb097bf3ba44da6f9ce16484d82a32d3e274c3 100644 (file)
@@ -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, &region);
        isc_region_consume(&region, 2);
        dns_name_fromregion(&name, &region);
 
-       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
index bfff78c66378b3a5c85e79566243541d583360d6..fc9279eebeb92f6010c414896e13b0629f0334bb 100644 (file)
@@ -528,6 +528,7 @@ additionaldata_sig(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_sig);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 09bb04fab431749568603fc4da649ea45a01c230..5d85652d9cf897e5bd0b498d56bb0d058066851e 100644 (file)
@@ -242,6 +242,7 @@ additionaldata_sink(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_sink);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 8871369d9e0de5d86e3d5f76d774d182170d7221..dd3894b30de2ee695f52e73cfb28942b9b8190f5 100644 (file)
@@ -102,6 +102,7 @@ additionaldata_smimea(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_smimea);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index c30b079b58d3ffc5b4ace21398f56e7691f3e61d..c9fbc10afee04d49b28e0392da71a75e2077f116 100644 (file)
@@ -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);
 }
 
index 4687324e30bd392aefa2e1fa036887c0ecc34b7f..29d5c54fa5e9896c0e088ec00445b1ed33655628 100644 (file)
@@ -96,6 +96,7 @@ additionaldata_spf(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_spf);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 9c604c1380fd20db4970c93d4358e212c34715a8..8c91d8fbccef8690a4b656b9c3b9f6656dd37a21 100644 (file)
@@ -246,6 +246,7 @@ additionaldata_sshfp(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_sshfp);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 93e095d4acb377af2052863f0b2848e50b0d597b..69875c36ab5c27bbce7ea70baf9f35c299f7dfdd 100644 (file)
@@ -112,6 +112,7 @@ additionaldata_ta(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_ta);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index bf001bc160ae8786f043a8ed09f9abbcef4043c9..1682facae223fd25faefd4731c43c5d0c536e80b 100644 (file)
@@ -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);
 }
 
index 4eae9d90942cf98996584008fcca3135c1ab5ad8..6ba242789de13665f4cc65e31b5ad0fe2199ab24 100644 (file)
@@ -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);
 }
 
index 97ea972cbc137d81b8d10a12f6158d93c383b316..7ec2aaaa67879e3e79988c21df65aeb80154bd1c 100644 (file)
@@ -289,6 +289,7 @@ additionaldata_tlsa(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_tlsa);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 643fb3dbd7e3f2b372f747ebeae80c6de485c44d..b0f1c0c9aa02824b69a0286f9a08437aa8a07c39 100644 (file)
@@ -231,6 +231,7 @@ additionaldata_txt(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_txt);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index ae53d85c4b65a17efa1d4ceb38d1d8ef9c9663c4..b66b5834232cb9fea17ddc7b1572a6339764441e 100644 (file)
@@ -268,6 +268,7 @@ additionaldata_uri(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_uri);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 0ba32d582f81bda87915473833c68c64c9692db3..ec27cecae60a8838f0fb2a0dea4e141a34990927 100644 (file)
@@ -182,6 +182,7 @@ additionaldata_x25(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_x25);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 8bb2478e35901bc5d6a7777c9a858c254992270c..e4dae5548e929ba841239fc9822412090cb4456e 100644 (file)
@@ -300,6 +300,7 @@ additionaldata_zonemd(ARGS_ADDLDATA) {
        REQUIRE(rdata->type == dns_rdatatype_zonemd);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 6a4c1a53bf57287f3ca064bde88a0e21ffb8b84d..1df54fc6f66d57b44d2f2439375ea7b2d9f3fc57 100644 (file)
@@ -182,6 +182,7 @@ additionaldata_hs_a(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_hs);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 377c4ec82fd05336d083a4ece93b522a09523b77..5828ddb39c155af3645e8ae990eeaa8e0e445fca 100644 (file)
@@ -401,6 +401,7 @@ additionaldata_in_a6(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 24e303f257802cf2f7eff9c2658d7d7a20dd527d..cf544f027942bff3c7033d68848866d91886482e 100644 (file)
@@ -186,6 +186,7 @@ additionaldata_in_a(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index d7427a1757bf8c1cea4d92f3153338eb482902ad..5ac6d649db1b3a20a1d6cca12242827de53e837a 100644 (file)
@@ -198,6 +198,7 @@ additionaldata_in_aaaa(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 50b784c15de70a9cf40cb68873dcb5b6edae9f5c..5ba4527b83056a3df993e8df120c3b96b84598fd 100644 (file)
@@ -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);
 }
index 07a9198e53b4053468157ccd324e1870bd87cb86..11fb20326790898c18325963715576e3fb8317f9 100644 (file)
@@ -264,6 +264,7 @@ additionaldata_in_atma(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 454bf58292060eeb5194f548dfea2ca1382d41bb..8353e69f1043de04091dad372862ea63e8167eed 100644 (file)
@@ -182,6 +182,7 @@ additionaldata_in_dhcid(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index fdab429e50f84b21e032c04c97ebc171dd477416..454ad2d570badacd61c05dfb17a6aba142874b4c 100644 (file)
@@ -171,6 +171,7 @@ additionaldata_in_eid(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 464b58337de54eee0a37918e3af4cfd18ad2e784..ff562bec6dab6b6578ff8aa213fb1c80bf68ed31 100644 (file)
@@ -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,
index 2b47aa919facd176835f74e30d921f7b3bcfb258..bfa8d717713d205289b7713d4b0285d9776b5822 100644 (file)
@@ -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, &region);
        isc_region_consume(&region, 2);
        dns_name_fromregion(&name, &region);
 
-       return ((add)(arg, &name, dns_rdatatype_a));
+       return ((add)(arg, &name, dns_rdatatype_a, NULL));
 }
 
 static inline isc_result_t
index 751e5a8918edff7bb8a05bc664a04e498449e97a..ce4cc5f2af9cc7bb9b7ccac5763443e53421ed80 100644 (file)
@@ -171,6 +171,7 @@ additionaldata_in_nimloc(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index ea7bd3b6ae8d42784f55ca71d1396e28003a555b..9960ce818ca602585f75c8e6ae39e94d945000b8 100644 (file)
@@ -187,6 +187,7 @@ additionaldata_in_nsap_ptr(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index fe3361ce51b116c38e05abc7d6567bf2cdd6c831..fa2d3d6d3b1092d26086a96e7464ff5163a9b333 100644 (file)
@@ -206,6 +206,7 @@ additionaldata_in_nsap(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 73d595355ea0e4cdce4c9dba4ed2126d06fd16a5..02faa728bc0b7ae2d49d370da57fa644c7f92a29 100644 (file)
@@ -308,6 +308,7 @@ additionaldata_in_px(ARGS_ADDLDATA) {
        REQUIRE(rdata->rdclass == dns_rdataclass_in);
 
        UNUSED(rdata);
+       UNUSED(owner);
        UNUSED(add);
        UNUSED(arg);
 
index 80dd1d637c78112cff92c4b3393dd3fdeee98fc4..2a299cedf707782198f30569ff36b7d40434f58b 100644 (file)
@@ -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, &region);
        isc_region_consume(&region, 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
index 8987094aa3f547c17664777fd0375b345132bef8..94679f07ae797cda0fd2efbba201af4b60174255 100644 (file)
 #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, &region);
+       alias = uint16_fromregion(&region) == 0;
+       isc_region_consume(&region, 2);
+
+       dns_name_fromregion(&name, &region);
+
+       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, &current);
+
+                               result = dns_rdata_tostruct(&current, &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
index caa3892b6431a9bd9d1ed1285a8b283b12183b98..b837c55920145b0c5cbfc4a2e1b1b1ee3420eda9 100644 (file)
@@ -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);
 }
 
index 87fda079f9851d0973530488602b3305d6272948..c51916e7dd092e5b7ed3e63dc8a2aedf91adea82 100644 (file)
@@ -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);
                }
index f8b9c4d9a9730a7c40f2a2e007559a6385de8d29..0358241d9540ea682b9e033adcdb1391c3e48b82 100644 (file)
@@ -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;
                        }
                }
index f283c362ba6a9ef03810e71e6b392f4bf70a32e3..5d0fc9cb07e2f26da38fe212f77585cb83853143 100644 (file)
@@ -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));
 }
 
 /*
index 097733474fb408b638b8c3f048dbb94b7b559cfb..9ba1c8999255d388b8bea6fab28a00329961eb8b 100644 (file)
@@ -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);
 
index 974e80dc1b48441977777394309aa69e102067ec..a99835bd4e5bd38595b3347396997b2d77dee49a 100644 (file)
@@ -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;
index 81ff6abfe7692009f5615f1f8525713f80117016..f369c4813492e6579442d89c6d409e8e8f879a24 100644 (file)
@@ -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