]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Add constraints to dns requests ammount per task.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 21 Jul 2015 12:33:49 +0000 (13:33 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 21 Jul 2015 14:04:01 +0000 (15:04 +0100)
src/libserver/cfg_file.h
src/libserver/cfg_rcl.c
src/libserver/cfg_utils.c
src/libserver/dns.c
src/libserver/dns.h

index da7c3088bfb530f1c64777841634da2bd5460bf4..e2c43845ae20d32af8fe73c96bd681780c84645f 100644 (file)
@@ -254,6 +254,7 @@ struct rspamd_config {
        guint32 dns_throttling_time;                    /**< time in seconds for DNS throttling                                 */
        guint32 dns_io_per_server;                      /**< number of sockets per DNS server                                   */
        GList *nameservers;                             /**< list of nameservers or NULL to parse resolv.conf   */
+       guint32 dns_max_requests;                       /**< limit of DNS requests per task                                     */
 
        guint upstream_max_errors;                                              /**< upstream max errors before shutting off                    */
        gdouble upstream_error_time;                                    /**< rate of upstream errors                                                    */
index 26b47442aff33b303bf9e6680f309cf168968da5..aba8b741b95116925d4170c858b85bc48d5ad418 100644 (file)
@@ -1266,6 +1266,11 @@ rspamd_rcl_config_init (void)
                rspamd_rcl_parse_struct_integer,
                G_STRUCT_OFFSET (struct rspamd_config, dns_io_per_server),
                RSPAMD_CL_FLAG_INT_32);
+       rspamd_rcl_add_default_handler (sub,
+               "dns_max_requests",
+               rspamd_rcl_parse_struct_integer,
+               G_STRUCT_OFFSET (struct rspamd_config, dns_max_requests),
+               RSPAMD_CL_FLAG_INT_32);
 
        /* New DNS configuration */
        ssub = rspamd_rcl_add_section (&sub->subsections, "dns", NULL,
index 0c9e51ed869e1cb6e72b583b8d52822de77baa7b..407f6d78866bf69497685384fcfc8b2b6519fea9 100644 (file)
@@ -173,6 +173,7 @@ rspamd_config_defaults (struct rspamd_config *cfg)
        cfg->log_extended = TRUE;
 
        cfg->min_word_len = DEFAULT_MIN_WORD;
+       cfg->dns_max_requests = 64;
 }
 
 void
index 6c32ae205dab8d9cc9fedb472c9e70ddd0f772ac..f861904157e3f2598c6d8d3c807f873cb3e4abba 100644 (file)
@@ -123,6 +123,32 @@ make_dns_request (struct rspamd_dns_resolver *resolver,
        return TRUE;
 }
 
+gboolean make_dns_request_task (struct rspamd_task *task,
+       dns_callback_type cb,
+       gpointer ud,
+       enum rdns_request_type type,
+       const char *name)
+{
+       gboolean ret;
+
+       if (task->dns_requests >= task->cfg->dns_max_requests) {
+               return FALSE;
+       }
+
+       ret = make_dns_request (task->resolver, task->s, task->task_pool, cb, ud,
+                       type, name);
+
+       if (ret) {
+               task->dns_requests ++;
+
+               if (task->dns_requests >= task->cfg->dns_max_requests) {
+                       msg_info ("<%s> stop resolving on reaching %ud requests",
+                                       task->message_id, task->dns_requests);
+               }
+       }
+
+       return ret;
+}
 
 struct rspamd_dns_resolver *
 dns_resolver_init (rspamd_logger_t *logger,
index ffe80fae0162fec41eef2c42783062e9432df7f2..bc27f7d48c7cf58f21ef0a8695135cf9ea8ee09e 100644 (file)
@@ -66,4 +66,10 @@ gboolean make_dns_request (struct rspamd_dns_resolver *resolver,
        enum rdns_request_type type,
        const char *name);
 
+gboolean make_dns_request_task (struct rspamd_task *task,
+       dns_callback_type cb,
+       gpointer ud,
+       enum rdns_request_type type,
+       const char *name);
+
 #endif