typedef struct {
fetchctx_t * fctx;
dns_message_t * rmessage;
+ dns_name_t * ns_name;
} dns_chkarg_t;
struct dns_fetch {
* locally served zone.
*/
static inline bool
-name_external(dns_name_t *name, dns_rdatatype_t type, fetchctx_t *fctx) {
+name_external(dns_name_t *name, dns_name_t *ns_name, dns_rdatatype_t type,
+ fetchctx_t *fctx)
+{
isc_result_t result;
dns_forwarders_t *forwarders = NULL;
dns_fixedname_t fixed, zfixed;
int _orderp = 0;
unsigned int _nlabelsp = 0;
- apex = ISFORWARDER(fctx->addrinfo) ? fctx->fwdname : &fctx->domain;
+ apex = ISFORWARDER(fctx->addrinfo)
+ ? fctx->fwdname
+ : (ns_name != NULL) ? ns_name : &fctx->domain;
/*
* The name is outside the queried namespace.
result = dns_message_findname(rmessage, section, addname,
dns_rdatatype_any, 0, &name, NULL);
if (result == ISC_R_SUCCESS) {
- external = name_external(name, type, fctx);
+ external = name_external(name, chkarg->ns_name, type, fctx);
if (type == dns_rdatatype_a) {
for (rdataset = ISC_LIST_HEAD(name->list);
rdataset != NULL;
rdataset != NULL;
rdataset = ISC_LIST_NEXT(rdataset, link)) {
if (CHASE(rdataset)) {
- dns_chkarg_t chkarg;
+ dns_chkarg_t chkarg = { 0 };
chkarg.fctx = fctx;
chkarg.rmessage = rmessage;
rdataset->attributes &= ~DNS_RDATASETATTR_CHASE;
* we're not following a chain.)
*/
if (!negative_response && ns_name != NULL && oqname == NULL) {
- dns_chkarg_t chkarg;
+ dns_chkarg_t chkarg = { 0 };
/*
* We already know ns_name is a subdomain of fctx->domain.
* If ns_name is equal to fctx->domain, we're not making
FCTX_ATTR_SET(fctx, FCTX_ATTR_GLUING);
chkarg.fctx = fctx;
chkarg.rmessage = message;
+ chkarg.ns_name = ns_name;
/*
* Mark the glue records in the additional section to be cached.
if ((look_in_options & LOOK_FOR_GLUE_IN_ANSWER) != 0 &&
(fctx->type == dns_rdatatype_aaaa ||
fctx->type == dns_rdatatype_a)) {
- dns_chkarg_t chkarg;
+ dns_chkarg_t chkarg = { 0 };
chkarg.fcx = fctx;
chkarg.rmessage = message;
(void)dns_rdataset_additionaldata(ns_rdataset,
/*
* Don't accept DNAME from parent namespace.
*/
- if (name_external(name, dns_rdatatype_dname, fctx)) {
+ if (name_external(name, NULL, dns_rdatatype_dname,
+ fctx))
+ {
continue;
}
rdataset != NULL;
rdataset = ISC_LIST_NEXT(rdataset, link))
{
- dns_chkarg_t chkarg;
+ dns_chkarg_t chkarg = { 0 };
if (!validinanswer(rdataset, fctx)) {
return (DNS_R_FORMERR);
}
rdataset->attributes &= ~DNS_RDATASETATTR_CHASE;
chkarg.fctx = fctx;
chkarg.rmessage = message;
+ chkarg.ns_name = ns_name;
(void)dns_rdataset_additionaldata(rdataset,
check_related,
&chkarg, 0);
}
} else if (aname != NULL) {
- dns_chkarg_t chkarg;
+ dns_chkarg_t chkarg = { 0 };
if (!validinanswer(ardataset, fctx))
return (DNS_R_FORMERR);
if ((ardataset->type == dns_rdatatype_a ||
ardataset->trust = trust;
chkarg.fctx = fctx;
chkarg.rmessage = message;
+ chkarg.ns_name = ns_name;
(void)dns_rdataset_additionaldata(ardataset, check_related,
&chkarg, 0);
for (sigrdataset = ISC_LIST_HEAD(aname->list);
while (!done && result == ISC_R_SUCCESS) {
name = NULL;
dns_message_currentname(message, DNS_SECTION_AUTHORITY, &name);
- if (!name_external(name, dns_rdatatype_ns, fctx) &&
+ if (!name_external(name, ns_name, dns_rdatatype_ns, fctx) &&
dns_name_issubdomain(&fctx->name, name))
{
/*
if (rdataset->type == dns_rdatatype_ns ||
(rdataset->type == dns_rdatatype_rrsig &&
rdataset->covers == dns_rdatatype_ns)) {
- dns_chkarg_t chkarg;
+ dns_chkarg_t chkarg = { 0 };
name->attributes |=
DNS_NAMEATTR_CACHE;
rdataset->attributes |=
*/
chkarg.fctx = fctx;
chkarg.rmessage = message;
+ chkarg.ns_name = ns_name;
(void)dns_rdataset_additionaldata(
rdataset,
check_related,