]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix critical issue in surbl module
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 Dec 2015 23:49:54 +0000 (23:49 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 Dec 2015 23:49:54 +0000 (23:49 +0000)
Previously, surbl could send many DNS requests for a single URL

src/plugins/surbl.c

index d273f7e66928080d2d319fd918063d26e0632a63..4c830979de200d9b4d659573134bce80d6e51e3e 100644 (file)
@@ -807,6 +807,20 @@ format_surbl_request (rspamd_mempool_t * pool,
        url->surbl = result;
        url->surbllen = r;
 
+       if (!forced &&
+                       g_hash_table_lookup (surbl_module_ctx->whitelist, result) != NULL) {
+               msg_debug_pool ("url %s is whitelisted", result);
+               g_set_error (err, SURBL_ERROR,
+                               WHITELIST_ERROR,
+                               "URL is whitelisted: %s",
+                               result);
+               return NULL;
+       }
+
+       if (append_suffix) {
+               rspamd_snprintf (result + r, len - r, ".%s", suffix->suffix);
+       }
+
        if (tree != NULL) {
                if (g_hash_table_lookup (tree, result) != NULL) {
                        msg_debug_pool ("url %s is already registered", result);
@@ -821,21 +835,6 @@ format_surbl_request (rspamd_mempool_t * pool,
                }
        }
 
-       if (!forced &&
-               g_hash_table_lookup (surbl_module_ctx->whitelist, result) != NULL) {
-               msg_debug_pool ("url %s is whitelisted", result);
-               g_set_error (err, SURBL_ERROR,
-                       WHITELIST_ERROR,
-                       "URL is whitelisted: %s",
-                       result);
-               return NULL;
-       }
-
-
-       if (append_suffix) {
-               rspamd_snprintf (result + r, len - r, ".%s", suffix->suffix);
-       }
-
        msg_debug_pool ("request: %s, dots: %d, level: %d, orig: %*s",
                result,
                dots_num,
@@ -887,7 +886,8 @@ make_surbl_requests (struct rspamd_url *url, struct rspamd_task *task,
                        param->suffix = suffix;
                        param->host_resolve =
                                        rspamd_mempool_strdup (task->task_pool, surbl_req);
-                       debug_task ("send surbl dns ip request %s", surbl_req);
+                       debug_task ("send surbl dns ip request %s to %s", surbl_req,
+                                       suffix->suffix);
 
                        if (make_dns_request_task (task,
                                        surbl_dns_ip_callback,
@@ -1032,6 +1032,11 @@ surbl_dns_ip_callback (struct rdns_reply *reply, gpointer arg)
                                                ip_addr >> 16 & 0xff,
                                                ip_addr >> 8 & 0xff,
                                                ip_addr & 0xff, param->suffix->suffix);
+                               msg_debug_task (
+                                               "<%s> domain [%s] send %v request to surbl",
+                                               param->task->message_id,
+                                               param->host_resolve,
+                                               to_resolve);
 
                                if (make_dns_request_task (task,
                                                surbl_dns_callback,
@@ -1283,7 +1288,7 @@ surbl_test_url (struct rspamd_task *task, void *user_data)
 
        param.task = task;
        param.suffix = suffix;
-       param.tree = g_hash_table_new (rspamd_str_hash, rspamd_str_equal);
+       param.tree = g_hash_table_new (rspamd_strcase_hash, rspamd_strcase_equal);
        rspamd_mempool_add_destructor (task->task_pool,
                (rspamd_mempool_destruct_t)g_hash_table_unref,
                param.tree);