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.
This commit is contained in:
Mark Andrews 2019-07-05 16:20:20 +10:00
parent baaa5492ee
commit cd985d96e3
101 changed files with 349 additions and 80 deletions

View 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

View file

@ -28,6 +28,7 @@ options {
* has a exclude list.
*/
root-delegation-only exclude { "a"; };
max-udp-size 4096;
};
zone "." {

View file

@ -29,6 +29,7 @@ options {
*/
prefetch 0;
querylog yes;
edns-udp-size 4096;
};
key rndc_key {

View file

@ -29,6 +29,7 @@ options {
*/
prefetch 0;
querylog yes;
edns-udp-size 4096;
};
key rndc_key {

View file

@ -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

View 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"

View 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.

View 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

View 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 *);

View 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));

View file

@ -29,12 +29,14 @@
#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>
@ -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;

View file

@ -567,6 +567,7 @@ additionaldata_any_tsig(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_any);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -261,6 +261,7 @@ additionaldata_ch_a(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_ch);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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

View file

@ -395,6 +395,7 @@ additionaldata_amtrelay(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_amtrelay);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -95,6 +95,7 @@ additionaldata_avc(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_avc);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -572,6 +572,7 @@ additionaldata_caa(ARGS_ADDLDATA) {
REQUIRE(rdata->length >= 3U);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -108,6 +108,7 @@ additionaldata_cdnskey(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_cdnskey);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -116,6 +116,7 @@ additionaldata_cds(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_cds);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -235,6 +235,7 @@ additionaldata_cert(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_cert);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);

View file

@ -214,6 +214,7 @@ additionaldata_csync(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_csync);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -112,6 +112,7 @@ additionaldata_dlv(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_dlv);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);
}

View file

@ -109,6 +109,7 @@ additionaldata_dnskey(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_dnskey);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);
}

View file

@ -335,6 +335,7 @@ additionaldata_ds(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_ds);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -159,6 +159,7 @@ additionaldata_eui48(ARGS_ADDLDATA) {
REQUIRE(rdata->length == 6);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -162,6 +162,7 @@ additionaldata_eui64(ARGS_ADDLDATA) {
REQUIRE(rdata->length == 8);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -205,6 +205,7 @@ additionaldata_gpos(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_gpos);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);
}

View 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);
}

View file

@ -440,6 +440,7 @@ additionaldata_ipseckey(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_ipseckey);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -196,6 +196,7 @@ additionaldata_isdn(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_isdn);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -415,6 +415,7 @@ additionaldata_key(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_key);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -412,6 +412,7 @@ additionaldata_keydata(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_keydata);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -178,6 +178,7 @@ additionaldata_l32(ARGS_ADDLDATA) {
REQUIRE(rdata->length == 6);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -172,6 +172,7 @@ additionaldata_l64(ARGS_ADDLDATA) {
REQUIRE(rdata->length == 10);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -785,6 +785,7 @@ additionaldata_loc(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_loc);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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

View 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

View 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

View 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

View file

@ -178,6 +178,7 @@ additionaldata_mg(ARGS_ADDLDATA) {
UNUSED(add);
UNUSED(arg);
UNUSED(rdata);
UNUSED(owner);
return (ISC_R_SUCCESS);
}

View file

@ -253,6 +253,7 @@ additionaldata_minfo(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_minfo);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -176,6 +176,7 @@ additionaldata_mr(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_mr);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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

View 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);

View file

@ -172,6 +172,7 @@ additionaldata_nid(ARGS_ADDLDATA) {
REQUIRE(rdata->length == 10);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -95,6 +95,7 @@ additionaldata_ninfo(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_ninfo);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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

View file

@ -362,6 +362,7 @@ additionaldata_nsec3(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_nsec3);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -272,6 +272,7 @@ additionaldata_nsec3param(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_nsec3param);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -213,6 +213,7 @@ additionaldata_nsec(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_nsec);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);
}

View file

@ -292,6 +292,7 @@ additionaldata_nxt(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_nxt);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -187,6 +187,7 @@ additionaldata_openpgpkey(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_openpgpkey);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -359,6 +359,7 @@ additionaldata_opt(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_opt);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);
}

View file

@ -190,6 +190,7 @@ additionaldata_ptr(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_ptr);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -105,6 +105,7 @@ additionaldata_rkey(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_rkey);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -252,6 +252,7 @@ additionaldata_rp(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_rp);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -536,6 +536,7 @@ additionaldata_rrsig(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_rrsig);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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

View file

@ -528,6 +528,7 @@ additionaldata_sig(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_sig);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -242,6 +242,7 @@ additionaldata_sink(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_sink);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -102,6 +102,7 @@ additionaldata_smimea(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_smimea);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);
}

View file

@ -96,6 +96,7 @@ additionaldata_spf(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_spf);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -246,6 +246,7 @@ additionaldata_sshfp(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_sshfp);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -112,6 +112,7 @@ additionaldata_ta(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_ta);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);
}

View 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);
}

View file

@ -289,6 +289,7 @@ additionaldata_tlsa(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_tlsa);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -231,6 +231,7 @@ additionaldata_txt(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_txt);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -268,6 +268,7 @@ additionaldata_uri(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_uri);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -182,6 +182,7 @@ additionaldata_x25(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_x25);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -300,6 +300,7 @@ additionaldata_zonemd(ARGS_ADDLDATA) {
REQUIRE(rdata->type == dns_rdatatype_zonemd);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -182,6 +182,7 @@ additionaldata_hs_a(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_hs);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -401,6 +401,7 @@ additionaldata_in_a6(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -186,6 +186,7 @@ additionaldata_in_a(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -198,6 +198,7 @@ additionaldata_in_aaaa(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);
}

View file

@ -264,6 +264,7 @@ additionaldata_in_atma(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -182,6 +182,7 @@ additionaldata_in_dhcid(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -171,6 +171,7 @@ additionaldata_in_eid(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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,

View 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

View file

@ -171,6 +171,7 @@ additionaldata_in_nimloc(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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);

View file

@ -206,6 +206,7 @@ additionaldata_in_nsap(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View file

@ -308,6 +308,7 @@ additionaldata_in_px(ARGS_ADDLDATA) {
REQUIRE(rdata->rdclass == dns_rdataclass_in);
UNUSED(rdata);
UNUSED(owner);
UNUSED(add);
UNUSED(arg);

View 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

View file

@ -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, &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

View file

@ -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);
}

View 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);
}

View 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;
}
}

View 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));
}
/*

View 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);

View 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;

Some files were not shown because too many files have changed in this diff Show more