* These have the same semantics as:
*
* foo_attach(b, a);
- * foo_detach(&a);
+ * foo_detach(&b);
*
* without the locking and magic testing.
*
*/
#define CALL_HOOK(_id, _qctx) \
do { \
- isc_result_t _res; \
+ isc_result_t _res = result; \
ns_hooktable_t *_tab = get_hooktab(_qctx); \
ns_hook_t *_hook; \
_hook = ISC_LIST_HEAD((*_tab)[_id]); \
query_addnxrrsetnsec(query_ctx_t *qctx);
static isc_result_t
-query_nxdomain(query_ctx_t *qctx, bool empty_wild);
+query_nxdomain(query_ctx_t *qctx, isc_result_t res);
static isc_result_t
query_redirect(query_ctx_t *qctx);
*/
static isc_result_t
query_setup(ns_client_t *client, dns_rdatatype_t qtype) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
query_ctx_t qctx;
qctx_init(client, NULL, qtype, &qctx);
*/
isc_result_t
ns__query_start(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
CCTRACE(ISC_LOG_DEBUG(3), "ns__query_start");
qctx->want_restart = false;
qctx->authoritative = false;
static isc_result_t
query_lookup(query_ctx_t *qctx) {
isc_buffer_t b;
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
dns_clientinfomethods_t cm;
dns_clientinfo_t ci;
dns_name_t *rpzqname = NULL;
}
#endif /* ifdef ISC_MUTEX_ATOMICS */
-isc_result_t
-ns_query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
- dns_name_t *qdomain, dns_rdataset_t *nameservers,
- bool resuming) {
- isc_result_t result;
- dns_rdataset_t *rdataset, *sigrdataset;
- isc_sockaddr_t *peeraddr = NULL;
-
- CTRACE(ISC_LOG_DEBUG(3), "ns_query_recurse");
-
- /*
- * Check recursion parameters from the previous query to see if they
- * match. If not, update recursion parameters and proceed.
- */
- if (recparam_match(&client->query.recparam, qtype, qname, qdomain)) {
- ns_client_log(client, NS_LOGCATEGORY_CLIENT, NS_LOGMODULE_QUERY,
- ISC_LOG_INFO, "recursion loop detected");
- return (ISC_R_FAILURE);
- }
-
- recparam_update(&client->query.recparam, qtype, qname, qdomain);
-
- if (!resuming) {
- inc_stats(client, ns_statscounter_recursion);
- }
+/*%
+ * Check recursion quota before making the current client "recursing".
+ */
+static isc_result_t
+check_recursionquota(ns_client_t *client) {
+ isc_result_t result = ISC_R_SUCCESS;
/*
* We are about to recurse, which means that this client will
ns_statscounter_recursclients);
}
+ return (result);
+}
+
+isc_result_t
+ns_query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
+ dns_name_t *qdomain, dns_rdataset_t *nameservers,
+ bool resuming) {
+ isc_result_t result;
+ dns_rdataset_t *rdataset, *sigrdataset;
+ isc_sockaddr_t *peeraddr = NULL;
+
+ CTRACE(ISC_LOG_DEBUG(3), "ns_query_recurse");
+
+ /*
+ * Check recursion parameters from the previous query to see if they
+ * match. If not, update recursion parameters and proceed.
+ */
+ if (recparam_match(&client->query.recparam, qtype, qname, qdomain)) {
+ ns_client_log(client, NS_LOGCATEGORY_CLIENT, NS_LOGMODULE_QUERY,
+ ISC_LOG_INFO, "recursion loop detected");
+ return (ISC_R_FAILURE);
+ }
+
+ recparam_update(&client->query.recparam, qtype, qname, qdomain);
+
+ if (!resuming) {
+ inc_stats(client, ns_statscounter_recursion);
+ }
+
+ result = check_recursionquota(client);
+ if (result != ISC_R_SUCCESS) {
+ return (result);
+ }
+
/*
* Invoke the resolver.
*/
*/
static isc_result_t
query_resume(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
dns_name_t *tname;
isc_buffer_t b;
#ifdef WANT_QUERYTRACE
return (query_delegation(qctx));
case DNS_R_EMPTYNAME:
- return (query_nodata(qctx, DNS_R_EMPTYNAME));
case DNS_R_NXRRSET:
- return (query_nodata(qctx, DNS_R_NXRRSET));
+ return (query_nodata(qctx, result));
case DNS_R_EMPTYWILD:
- return (query_nxdomain(qctx, true));
-
case DNS_R_NXDOMAIN:
- return (query_nxdomain(qctx, false));
+ return (query_nxdomain(qctx, result));
case DNS_R_COVERINGNSEC:
return (query_coveringnsec(qctx));
query_respond_any(query_ctx_t *qctx) {
bool found = false, hidden = false;
dns_rdatasetiter_t *rdsiter = NULL;
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
dns_rdatatype_t onetype = 0; /* type to use for minimal-any */
isc_buffer_t b;
static isc_result_t
query_addanswer(query_ctx_t *qctx) {
dns_rdataset_t **sigrdatasetp = NULL;
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
CCTRACE(ISC_LOG_DEBUG(3), "query_addanswer");
*/
static isc_result_t
query_respond(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
CCTRACE(ISC_LOG_DEBUG(3), "query_respond");
*/
static isc_result_t
query_notfound(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
CCTRACE(ISC_LOG_DEBUG(3), "query_notfound");
*/
static isc_result_t
query_prepare_delegation_response(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
dns_rdataset_t **sigrdatasetp = NULL;
bool detach = false;
*/
static isc_result_t
query_zone_delegation(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
CALL_HOOK(NS_QUERY_ZONE_DELEGATION_BEGIN, qctx);
*/
static isc_result_t
query_delegation(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
CCTRACE(ISC_LOG_DEBUG(3), "query_delegation");
*/
static isc_result_t
query_delegation_recurse(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
dns_name_t *qname = qctx->client->query.qname;
CCTRACE(ISC_LOG_DEBUG(3), "query_delegation_recurse");
* Handle NXDOMAIN and empty wildcard responses.
*/
static isc_result_t
-query_nxdomain(query_ctx_t *qctx, bool empty_wild) {
+query_nxdomain(query_ctx_t *qctx, isc_result_t res) {
dns_section_t section;
uint32_t ttl;
- isc_result_t result;
+ isc_result_t result = res;
+ bool empty_wild = (res == DNS_R_EMPTYWILD);
CCTRACE(ISC_LOG_DEBUG(3), "query_nxdomain");
*/
static isc_result_t
query_cname(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
dns_name_t *tname;
dns_rdataset_t *trdataset;
dns_rdataset_t **sigrdatasetp = NULL;
dns_namereln_t namereln;
isc_buffer_t b;
int order;
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
unsigned int nlabels;
CCTRACE(ISC_LOG_DEBUG(3), "query_dname");
*/
static isc_result_t
query_prepresponse(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
CCTRACE(ISC_LOG_DEBUG(3), "query_prepresponse");
isc_result_t
ns_query_done(query_ctx_t *qctx) {
- isc_result_t result;
+ isc_result_t result = ISC_R_UNSET;
const dns_namelist_t *secs = qctx->client->message->sections;
CCTRACE(ISC_LOG_DEBUG(3), "ns_query_done");