client->query.redirect.result = ISC_R_SUCCESS;
client->query.redirect.rdataset = NULL;
client->query.redirect.sigrdataset = NULL;
+ client->query.redirect.authoritative = ISC_FALSE;
+ client->query.redirect.is_zone = ISC_FALSE;
dns_fixedname_init(&client->query.redirect.fixed);
client->query.redirect.fname =
dns_fixedname_name(&client->query.redirect.fixed);
return (result);
}
-
static inline isc_result_t
query_getdb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype,
unsigned int options, dns_zone_t **zonep, dns_db_t **dbp,
static isc_result_t
redirect2(ns_client_t *client, dns_name_t *name, dns_rdataset_t *rdataset,
dns_dbnode_t **nodep, dns_db_t **dbp, dns_dbversion_t **versionp,
- dns_rdatatype_t qtype)
+ dns_rdatatype_t qtype, isc_boolean_t *is_zonep)
{
dns_db_t *db = NULL;
dns_dbnode_t *node = NULL;
dns_clientinfo_t ci;
dns_dbversion_t *version = NULL;
dns_zone_t *zone = NULL;
+ isc_boolean_t is_zone;
unsigned int options;
- isc_boolean_t is_zonep = ISC_FALSE;
CTRACE(ISC_LOG_DEBUG(3), "redirect2");
options = 0;
result = query_getdb(client, redirectname, qtype, options, &zone,
- &db, &version, &is_zonep);
+ &db, &version, &is_zone);
if (result != ISC_R_SUCCESS)
return (ISC_R_NOTFOUND);
if (zone != NULL)
dns_db_attach(db, dbp);
dns_db_detachnode(db, &node);
dns_db_detach(&db);
+ *is_zonep = is_zone;
*versionp = version;
client->query.attributes |= (NS_QUERYATTR_NOAUTHORITY |
RESTORE(node, client->query.redirect.node);
RESTORE(zone, client->query.redirect.zone);
authoritative = client->query.redirect.authoritative;
+ is_zone = client->query.redirect.is_zone;
/*
* Free resources used while recursing.
isc_event_free(ISC_EVENT_PTR(&event));
} else if (REDIRECT(client)) {
result = client->query.redirect.result;
- is_zone = ISC_TF(result == DNS_R_NXDOMAIN);
+ is_zone = client->query.redirect.is_zone;
} else {
result = event->result;
}
/* FALLTHROUGH */
case DNS_R_NXDOMAIN:
- INSIST(is_zone);
+ INSIST(is_zone || REDIRECT(client));
if (!empty_wild) {
tresult = redirect(client, fname, rdataset, &node,
&db, &version, type);
goto ncache_nxrrset;
}
tresult = redirect2(client, fname, rdataset, &node,
- &db, &version, type);
+ &db, &version, type, &is_zone);
if (tresult == DNS_R_CONTINUE) {
inc_stats(client,
dns_nsstatscounter_nxdomainredirect_rlookup);
NULL);
client->query.redirect.authoritative =
authoritative;
+ client->query.redirect.is_zone = is_zone;
goto cleanup;
}
if (tresult == ISC_R_SUCCESS) {
goto ncache_nxrrset;
}
tresult = redirect2(client, fname, rdataset, &node,
- &db, &version, type);
+ &db, &version, type, &is_zone);
if (tresult == DNS_R_CONTINUE) {
inc_stats(client,
dns_nsstatscounter_nxdomainredirect_rlookup);
dns_name_copy(fname, client->query.redirect.fname,
NULL);
client->query.redirect.authoritative = authoritative;
+ client->query.redirect.is_zone = is_zone;
goto cleanup;
}
if (tresult == ISC_R_SUCCESS) {