#define MAXNAME (DNS_NAME_MAXTEXT+1)
+/*
+ * Default maximum number of chained queries before we give up
+ * to prevent CNAME loops.
+ */
+#define MAX_RESTARTS 11
+
/* Variables used internally by delv. */
char *progname;
static isc_mem_t *mctx = NULL;
goto cleanup;
}
+ dns_client_setmaxrestarts(client, MAX_RESTARTS);
+
/* Set the nameserver */
if (server != NULL)
addserver(client);
return (ISC_R_SUCCESS);
}
-#define MAX_RESTARTS 11
-
#define QUERY_ERROR(r) \
do { \
eresult = r; \
/*
* Restart the query?
*/
- if (want_restart && client->query.restarts < MAX_RESTARTS) {
+ if (want_restart && client->query.restarts <
+ client->view->max_restarts)
+ {
client->query.restarts++;
goto restart;
}
#define UCTX_MAGIC ISC_MAGIC('U', 'c', 't', 'x')
#define UCTX_VALID(c) ISC_MAGIC_VALID(c, UCTX_MAGIC)
-#define MAX_RESTARTS 11
-
#ifdef TUNE_LARGE
#define RESOLVER_NTASKS 523
#else
unsigned int update_udpretries;
unsigned int find_timeout;
unsigned int find_udpretries;
+ uint8_t max_restarts;
isc_refcount_t references;
#define DEF_FIND_TIMEOUT 5
#define DEF_FIND_UDPRETRIES 3
+#define DEF_MAX_RESTARTS 11
#define DNS_CLIENTATTR_OWNCTX 0x01
client->taskmgr = taskmgr;
client->socketmgr = socketmgr;
client->timermgr = timermgr;
+ client->max_restarts = DEF_MAX_RESTARTS,
client->task = NULL;
result = isc_task_create(client->taskmgr, 0, &client->task);
return (result);
}
+void
+dns_client_setmaxrestarts(dns_client_t *client, uint8_t max_restarts) {
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(max_restarts > 0);
+
+ client->max_restarts = max_restarts;
+}
+
static isc_result_t
getrdataset(isc_mem_t *mctx, dns_rdataset_t **rdatasetp) {
dns_rdataset_t *rdataset;
/*
* Limit the number of restarts.
*/
- if (want_restart && rctx->restarts == MAX_RESTARTS) {
+ if (want_restart &&
+ rctx->restarts == rctx->client->max_restarts)
+ {
want_restart = false;
result = ISC_R_QUOTA;
send_event = true;
*\li Anything else Failure.
*/
+void
+dns_client_setmaxrestarts(dns_client_t *client, uint8_t max_restarts);
+/*%<
+ * Set the number of permissible chained queries before we give up,
+ * to prevent CNAME loops. This defaults to 11.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+
+ *\li 'max_restarts' is greater than 0.
+ */
+
isc_result_t
dns_client_setdlv(dns_client_t *client, dns_rdataclass_t rdclass,
const char *dlvname);
dns_dlzdblist_t dlz_unsearched;
uint32_t fail_ttl;
dns_badcache_t *failcache;
+ uint8_t max_restarts;
/*
* Configurable data for server use only,
*/
+void
+dns_view_setmaxrestarts(dns_view_t *view, uint8_t max_restarts);
+/*%<
+ * Set the number of permissible chained queries before we give up,
+ * to prevent CNAME loops. This defaults to 11.
+ *
+ * Requires:
+ *
+ *\li 'view' is valid;
+ *\li 'max_restarts' is greater than 0.
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_VIEW_H */
static void adb_shutdown(isc_task_t *task, isc_event_t *event);
static void req_shutdown(isc_task_t *task, isc_event_t *event);
+/*%
+ * Default maximum number of chained queries before we give up
+ * to prevent CNAME loops.
+ */
+#define DEFAULT_MAX_RESTARTS 11
+
isc_result_t
dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
const char *name, dns_view_t **viewp)
view->dtenv = NULL;
view->dttypes = 0;
+ view->max_restarts = DEFAULT_MAX_RESTARTS;
+
result = isc_mutex_init(&view->new_zone_lock);
if (result != ISC_R_SUCCESS) {
goto cleanup_failcache;
dns_zt_setviewrevert(zonetable);
}
}
+
+void
+dns_view_setmaxrestarts(dns_view_t *view, uint8_t max_restarts) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(max_restarts > 0);
+
+ view->max_restarts = max_restarts;
+}
dns_client_request
dns_client_resolve
dns_client_setdlv
+dns_client_setmaxrestarts
dns_client_setservers
dns_client_startrequest
dns_client_startresolve
dns_view_setfailttl
dns_view_sethints
dns_view_setkeyring
+dns_view_setmaxrestarts
dns_view_setnewzones
dns_view_setresquerystats
dns_view_setresstats