]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Further fixes to maps usage
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 23 Apr 2018 16:31:59 +0000 (17:31 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 23 Apr 2018 16:31:59 +0000 (17:31 +0100)
src/libutil/map_helpers.c
src/plugins/dkim_check.c
src/plugins/fuzzy_check.c
src/plugins/surbl.c
src/plugins/surbl.h [deleted file]

index b22b430c6955fd0a48039dc51729de089f9eca72..2cc2a1efa2b228d5a0e4998d5b13e8dc0758d519 100644 (file)
@@ -566,6 +566,10 @@ rspamd_map_helper_new_hash (struct rspamd_map *map)
 void
 rspamd_map_helper_destroy_hash (struct rspamd_hash_map_helper *r)
 {
+       if (r == NULL) {
+               return;
+       }
+
        kh_destroy (rspamd_map_hash, r->htb);
        rspamd_mempool_delete (r->pool);
 }
@@ -596,6 +600,10 @@ rspamd_map_helper_new_radix (struct rspamd_map *map)
 void
 rspamd_map_helper_destroy_radix (struct rspamd_radix_map_helper *r)
 {
+       if (r == NULL) {
+               return;
+       }
+
        kh_destroy (rspamd_map_hash, r->htb);
        rspamd_mempool_delete (r->pool);
 }
@@ -628,6 +636,10 @@ rspamd_map_helper_destroy_regexp (struct rspamd_regexp_map_helper *re_map)
        rspamd_regexp_t *re;
        guint i;
 
+       if (!re_map) {
+               return;
+       }
+
        for (i = 0; i < re_map->regexps->len; i ++) {
                re = g_ptr_array_index (re_map->regexps, i);
                rspamd_regexp_unref (re);
@@ -1094,6 +1106,10 @@ rspamd_match_hash_map (struct rspamd_hash_map_helper *map, const gchar *in)
        khiter_t k;
        struct rspamd_map_helper_value *val;
 
+       if (map == NULL) {
+               return NULL;
+       }
+
        k = kh_get (rspamd_map_hash, map->htb, in);
 
        if (k != kh_end (map->htb)) {
@@ -1112,6 +1128,10 @@ rspamd_match_radix_map (struct rspamd_radix_map_helper *map,
 {
        struct rspamd_map_helper_value *val;
 
+       if (map == NULL) {
+               return NULL;
+       }
+
        val = (struct rspamd_map_helper_value *)radix_find_compressed (map->trie,
                        in, inlen);
 
@@ -1130,6 +1150,10 @@ rspamd_match_radix_map_addr (struct rspamd_radix_map_helper *map,
 {
        struct rspamd_map_helper_value *val;
 
+       if (map == NULL) {
+               return NULL;
+       }
+
        val = (struct rspamd_map_helper_value *)radix_find_compressed_addr (map->trie, addr);
 
        if (val != (gconstpointer)RADIX_NO_VALUE) {
index 56e4bf700e237cf30b8345767a330f49b4446223..d666289ec17eaed902ac8e856a21d4594b115698 100644 (file)
@@ -35,6 +35,7 @@
 #include "libserver/dkim.h"
 #include "libutil/hash.h"
 #include "libutil/map.h"
+#include "libutil/map_helpers.h"
 #include "rspamd.h"
 #include "utlist.h"
 #include "lua/lua_common.h"
@@ -65,8 +66,8 @@ struct dkim_ctx {
        const gchar *symbol_permfail;
 
        rspamd_mempool_t *dkim_pool;
-       radix_compressed_t *whitelist_ip;
-       GHashTable *dkim_domains;
+       struct rspamd_radix_map_helper *whitelist_ip;
+       struct rspamd_hash_map_helper *dkim_domains;
        guint strict_multiplier;
        guint time_jitter;
        rspamd_lru_hash_t *dkim_hash;
@@ -311,7 +312,7 @@ dkim_module_config (struct rspamd_config *cfg)
        }
 
        lua_pop (cfg->lua_state, 1); /* Remove global function */
-       dkim_module_ctx->whitelist_ip = radix_create_compressed ();
+       dkim_module_ctx->whitelist_ip = NULL;
 
        if ((value =
                        rspamd_config_get_module_opt (cfg, "options", "check_local")) != NULL) {
@@ -399,6 +400,10 @@ dkim_module_config (struct rspamd_config *cfg)
 
                rspamd_config_radix_from_ucl (cfg, value, "DKIM whitelist",
                                &dkim_module_ctx->whitelist_ip, NULL);
+               rspamd_mempool_add_destructor (dkim_module_ctx->dkim_pool,
+                               (rspamd_mempool_destruct_t)rspamd_map_helper_destroy_radix,
+                               dkim_module_ctx->whitelist_ip);
+
        }
 
        if ((value =
@@ -410,6 +415,9 @@ dkim_module_config (struct rspamd_config *cfg)
                                ucl_object_tostring (value));
                }
                else {
+                       rspamd_mempool_add_destructor (dkim_module_ctx->dkim_pool,
+                                       (rspamd_mempool_destruct_t)rspamd_map_helper_destroy_hash,
+                                       dkim_module_ctx->dkim_domains);
                        got_trusted = TRUE;
                }
        }
@@ -423,6 +431,9 @@ dkim_module_config (struct rspamd_config *cfg)
                                        ucl_object_tostring (value));
                }
                else {
+                       rspamd_mempool_add_destructor (dkim_module_ctx->dkim_pool,
+                                       (rspamd_mempool_destruct_t)rspamd_map_helper_destroy_hash,
+                                       dkim_module_ctx->dkim_domains);
                        got_trusted = TRUE;
                }
        }
@@ -797,11 +808,6 @@ dkim_module_reconfig (struct rspamd_config *cfg)
 
        saved_ctx = dkim_module_ctx->ctx;
        rspamd_mempool_delete (dkim_module_ctx->dkim_pool);
-       radix_destroy_compressed (dkim_module_ctx->whitelist_ip);
-
-       if (dkim_module_ctx->dkim_domains) {
-               g_hash_table_destroy (dkim_module_ctx->dkim_domains);
-       }
 
        if (dkim_module_ctx->dkim_hash) {
                rspamd_lru_hash_destroy (dkim_module_ctx->dkim_hash);
@@ -864,7 +870,7 @@ dkim_module_check (struct dkim_check_result *res)
                        if (dkim_module_ctx->dkim_domains != NULL) {
                                /* Perform strict check */
                                if ((strict_value =
-                                               g_hash_table_lookup (dkim_module_ctx->dkim_domains,
+                                               rspamd_match_hash_map (dkim_module_ctx->dkim_domains,
                                                                rspamd_dkim_get_domain (cur->ctx))) != NULL) {
                                        if (!dkim_module_parse_strict (strict_value, &cur->mult_allow,
                                                        &cur->mult_deny)) {
@@ -1020,8 +1026,8 @@ dkim_symbol_callback (struct rspamd_task *task, void *unused)
                return;
        }
        /* Check whitelist */
-       if (radix_find_compressed_addr (dkim_module_ctx->whitelist_ip,
-                       task->from_addr) != RADIX_NO_VALUE) {
+       if (rspamd_match_radix_map_addr (dkim_module_ctx->whitelist_ip,
+                       task->from_addr) != NULL) {
                msg_info_task ("skip DKIM checks for whitelisted address");
                return;
        }
@@ -1085,7 +1091,7 @@ dkim_symbol_callback (struct rspamd_task *task, void *unused)
 
                                if (dkim_module_ctx->trusted_only &&
                                                (dkim_module_ctx->dkim_domains == NULL ||
-                                                               g_hash_table_lookup (dkim_module_ctx->dkim_domains,
+                                                               rspamd_match_hash_map (dkim_module_ctx->dkim_domains,
                                                                                rspamd_dkim_get_domain (ctx)) == NULL)) {
                                        msg_debug_task ("skip dkim check for %s domain",
                                                        rspamd_dkim_get_domain (ctx));
index 90f04e0591044913e500a5765c1b5cfa299fe7c4..fe95dc7155b09d9ffbf707f8970df093bef98044 100644 (file)
@@ -33,6 +33,7 @@
 #include "config.h"
 #include "libmime/message.h"
 #include "libutil/map.h"
+#include "libutil/map_helpers.h"
 #include "libmime/images.h"
 #include "libserver/worker_util.h"
 #include "fuzzy_wire.h"
@@ -88,7 +89,7 @@ struct fuzzy_rule {
        gboolean fuzzy_images;
        gboolean short_text_direct_hash;
        gint learn_condition_cb;
-       GHashTable *skip_map;
+       struct rspamd_hash_map_helper *skip_map;
 };
 
 struct fuzzy_ctx {
@@ -425,6 +426,9 @@ fuzzy_parse_rule (struct rspamd_config *cfg, const ucl_object_t *obj,
                rspamd_map_add_from_ucl (cfg, value,
                        "Fuzzy hashes whitelist", rspamd_kv_list_read, rspamd_kv_list_fin,
                        (void **)&rule->skip_map);
+               rspamd_mempool_add_destructor (fuzzy_module_ctx->fuzzy_pool,
+                               (rspamd_mempool_destruct_t)rspamd_map_helper_destroy_radix,
+                               rule->skip_map);
        }
        else {
                rule->skip_map = NULL;
@@ -1911,7 +1915,7 @@ fuzzy_insert_result (struct fuzzy_client_session *session,
                        rspamd_encode_hex_buf (cmd->digest, sizeof (cmd->digest),
                                hexbuf, sizeof (hexbuf) - 1);
                        hexbuf[sizeof (hexbuf) - 1] = '\0';
-                       if (g_hash_table_lookup (session->rule->skip_map, hexbuf)) {
+                       if (rspamd_match_hash_map (session->rule->skip_map, hexbuf)) {
                                return;
                        }
                }
index 01cfb594484f206c82cf42ecb779051f6a6a509b..62b96e75f3d81fc18b650944de08e0202683310c 100644 (file)
 #include "config.h"
 #include "libmime/message.h"
 #include "libutil/map.h"
+#include "libutil/map_helpers.h"
 #include "rspamd.h"
-#include "surbl.h"
 #include "utlist.h"
+#include "multipattern.h"
+#include "monitored.h"
 #include "libserver/html.h"
 #include "libutil/http_private.h"
 #include "unix-std.h"
 
 INIT_LOG_MODULE(surbl)
 
+#define DEFAULT_SURBL_WEIGHT 10
+#define DEFAULT_REDIRECTOR_READ_TIMEOUT 5.0
+#define DEFAULT_SURBL_SYMBOL "SURBL_DNS"
+#define SURBL_OPTION_NOIP (1 << 0)
+#define SURBL_OPTION_RESOLVEIP (1 << 1)
+#define SURBL_OPTION_CHECKIMAGES (1 << 2)
+#define MAX_LEVELS 10
+
+struct surbl_ctx {
+       struct module_ctx ctx;
+       guint16 weight;
+       gdouble read_timeout;
+       gboolean use_tags;
+       GList *suffixes;
+       gchar *metric;
+       const gchar *redirector_symbol;
+       GHashTable **exceptions;
+       struct rspamd_hash_map_helper *whitelist;
+       void *redirector_map_data;
+       GHashTable *redirector_tlds;
+       guint use_redirector;
+       guint max_redirected_urls;
+       gint redirector_cbid;
+       struct upstream_list *redirectors;
+       rspamd_mempool_t *surbl_pool;
+};
+
+struct suffix_item {
+       guint64 magic;
+       const gchar *monitored_domain;
+       const gchar *suffix;
+       const gchar *symbol;
+       guint32 options;
+       GArray *bits;
+       GHashTable *ips;
+       struct rspamd_monitored *m;
+       gint callback_id;
+       gint url_process_cbref;
+};
+
+struct dns_param {
+       struct rspamd_url *url;
+       struct rspamd_task *task;
+       gchar *host_resolve;
+       struct suffix_item *suffix;
+       struct rspamd_async_watcher *w;
+};
+
+struct redirector_param {
+       struct rspamd_url *url;
+       struct rspamd_task *task;
+       struct upstream *redirector;
+       struct rspamd_http_connection *conn;
+       GHashTable *tree;
+       struct suffix_item *suffix;
+       struct rspamd_async_watcher *w;
+       gint sock;
+       guint redirector_requests;
+};
+
+struct surbl_bit_item {
+       guint32 bit;
+       gchar *symbol;
+};
+
 #define SURBL_REDIRECTOR_CALLBACK "SURBL_REDIRECTOR_CALLBACK"
 
 static struct surbl_ctx *surbl_module_ctx = NULL;
@@ -304,10 +371,9 @@ surbl_module_init (struct rspamd_config *cfg, struct module_ctx **ctx)
        surbl_module_ctx->surbl_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
 
        surbl_module_ctx->redirectors = NULL;
-       surbl_module_ctx->whitelist = g_hash_table_new (rspamd_strcase_hash,
-                       rspamd_strcase_equal);
+       surbl_module_ctx->whitelist = NULL;
        rspamd_mempool_add_destructor (surbl_module_ctx->surbl_pool,
-                       (rspamd_mempool_destruct_t) g_hash_table_destroy,
+                       (rspamd_mempool_destruct_t) rspamd_map_helper_destroy_hash,
                        surbl_module_ctx->whitelist);
        surbl_module_ctx->exceptions = rspamd_mempool_alloc0 (
                        surbl_module_ctx->surbl_pool, MAX_LEVELS * sizeof (GHashTable *));
@@ -901,7 +967,7 @@ surbl_module_config (struct rspamd_config *cfg)
        if ((value =
                        rspamd_config_get_module_opt (cfg, "surbl", "whitelist")) != NULL) {
                rspamd_map_add_from_ucl (cfg, value,
-                               "SURBL whitelist", rspamd_hosts_read, rspamd_hosts_fin,
+                               "SURBL whitelist", rspamd_kv_list_read, rspamd_kv_list_fin,
                                (void **)&surbl_module_ctx->whitelist);
        }
 
@@ -979,15 +1045,14 @@ surbl_module_reconfig (struct rspamd_config *cfg)
        surbl_module_ctx->surbl_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
 
        surbl_module_ctx->redirectors = NULL;
-       surbl_module_ctx->whitelist = g_hash_table_new (rspamd_strcase_hash,
-                       rspamd_strcase_equal);
+       surbl_module_ctx->whitelist = NULL;
        /* Zero exceptions hashes */
        surbl_module_ctx->exceptions = rspamd_mempool_alloc0 (
                surbl_module_ctx->surbl_pool,
                MAX_LEVELS * sizeof (GHashTable *));
        /* Register destructors */
        rspamd_mempool_add_destructor (surbl_module_ctx->surbl_pool,
-               (rspamd_mempool_destruct_t) g_hash_table_destroy,
+               (rspamd_mempool_destruct_t) rspamd_map_helper_destroy_hash,
                surbl_module_ctx->whitelist);
        rspamd_mempool_add_destructor (surbl_module_ctx->surbl_pool,
                (rspamd_mempool_destruct_t) g_hash_table_destroy,
@@ -1136,7 +1201,7 @@ format_surbl_request (rspamd_mempool_t * pool,
        url->surbllen = r;
 
        if (!forced &&
-                       g_hash_table_lookup (surbl_module_ctx->whitelist, result) != NULL) {
+                       rspamd_match_hash_map (surbl_module_ctx->whitelist, result) != NULL) {
                msg_debug_pool ("url %s is whitelisted", result);
                g_set_error (err, SURBL_ERROR,
                                WHITELIST_ERROR,
diff --git a/src/plugins/surbl.h b/src/plugins/surbl.h
deleted file mode 100644 (file)
index 9671ac6..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef RSPAMD_MODULE_SURBL
-#define RSPAMD_MODULE_SURBL
-
-#include "config.h"
-#include "multipattern.h"
-#include "monitored.h"
-
-#define DEFAULT_SURBL_WEIGHT 10
-#define DEFAULT_REDIRECTOR_READ_TIMEOUT 5.0
-#define DEFAULT_SURBL_SYMBOL "SURBL_DNS"
-#define SURBL_OPTION_NOIP (1 << 0)
-#define SURBL_OPTION_RESOLVEIP (1 << 1)
-#define SURBL_OPTION_CHECKIMAGES (1 << 2)
-#define MAX_LEVELS 10
-
-struct surbl_ctx {
-       struct module_ctx ctx;
-       guint16 weight;
-       gdouble read_timeout;
-       gboolean use_tags;
-       GList *suffixes;
-       gchar *metric;
-       const gchar *redirector_symbol;
-       GHashTable **exceptions;
-       GHashTable *whitelist;
-       void *redirector_map_data;
-       GHashTable *redirector_tlds;
-       guint use_redirector;
-       guint max_redirected_urls;
-       gint redirector_cbid;
-       struct upstream_list *redirectors;
-       rspamd_mempool_t *surbl_pool;
-};
-
-struct suffix_item {
-       guint64 magic;
-       const gchar *monitored_domain;
-       const gchar *suffix;
-       const gchar *symbol;
-       guint32 options;
-       GArray *bits;
-       GHashTable *ips;
-       struct rspamd_monitored *m;
-       gint callback_id;
-       gint url_process_cbref;
-};
-
-struct dns_param {
-       struct rspamd_url *url;
-       struct rspamd_task *task;
-       gchar *host_resolve;
-       struct suffix_item *suffix;
-       struct rspamd_async_watcher *w;
-};
-
-struct redirector_param {
-       struct rspamd_url *url;
-       struct rspamd_task *task;
-       struct upstream *redirector;
-       struct rspamd_http_connection *conn;
-       GHashTable *tree;
-       struct suffix_item *suffix;
-       struct rspamd_async_watcher *w;
-       gint sock;
-       guint redirector_requests;
-};
-
-struct surbl_bit_item {
-       guint32 bit;
-       gchar *symbol;
-};
-
-#endif