]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add magic for callback data in rspamd rules
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 7 Apr 2016 12:43:09 +0000 (13:43 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 7 Apr 2016 12:43:09 +0000 (13:43 +0100)
src/libserver/symbols_cache.h
src/lua/lua_config.c
src/plugins/regexp.c
src/plugins/surbl.c
src/plugins/surbl.h

index 0874ac475702b1da49853ceffcc4b04b20e0071b..0d94a77a3e947616e1bc82174b995c822e3f1f75 100644 (file)
@@ -38,6 +38,14 @@ enum rspamd_symbol_type {
        SYMBOL_TYPE_FINE = (1 << 7)
 };
 
+/**
+ * Abstract structure for saving callback data for symbols
+ */
+struct rspamd_abstract_callback_data {
+       guint64 magic;
+       char data[];
+};
+
 /**
  * Creates new cache structure
  * @return
index aa4327b276415b58ce0e72db14b272822c6cd9af..5c4acf02cac59057de49ad34a3b4e0e1898a1496 100644 (file)
@@ -446,6 +446,8 @@ static const struct luaL_reg configlib_m[] = {
        {NULL, NULL}
 };
 
+static const guint64 rspamd_lua_callback_magic = 0x32c118af1e3263c7ULL;
+
 struct rspamd_config *
 lua_check_config (lua_State * L, gint pos)
 {
@@ -588,13 +590,15 @@ lua_config_get_classifier (lua_State * L)
 }
 
 struct lua_callback_data {
+       guint64 magic;
+       lua_State *L;
+       gchar *symbol;
+
        union {
                gchar *name;
                gint ref;
        } callback;
        gboolean cb_is_ref;
-       lua_State *L;
-       gchar *symbol;
 };
 
 /*
@@ -666,6 +670,8 @@ lua_config_register_post_filter (lua_State *L)
                cd =
                        rspamd_mempool_alloc (cfg->cfg_pool,
                                sizeof (struct lua_callback_data));
+               cd->magic = rspamd_lua_callback_magic;
+
                if (lua_type (L, 2) == LUA_TSTRING) {
                        cd->callback.name = rspamd_mempool_strdup (cfg->cfg_pool,
                                        luaL_checkstring (L, 2));
@@ -677,6 +683,7 @@ lua_config_register_post_filter (lua_State *L)
                        cd->callback.ref = luaL_ref (L, LUA_REGISTRYINDEX);
                        cd->cb_is_ref = TRUE;
                }
+
                cd->L = L;
                cfg->post_filters = g_list_prepend (cfg->post_filters, cd);
                rspamd_mempool_add_destructor (cfg->cfg_pool,
@@ -735,6 +742,8 @@ lua_config_register_pre_filter (lua_State *L)
                cd =
                        rspamd_mempool_alloc (cfg->cfg_pool,
                                sizeof (struct lua_callback_data));
+               cd->magic = rspamd_lua_callback_magic;
+
                if (lua_type (L, 2) == LUA_TSTRING) {
                        cd->callback.name = rspamd_mempool_strdup (cfg->cfg_pool,
                                        luaL_checkstring (L, 2));
@@ -877,6 +886,7 @@ rspamd_register_symbol_fromlua (lua_State *L,
 
        cd = rspamd_mempool_alloc0 (cfg->cfg_pool,
                        sizeof (struct lua_callback_data));
+       cd->magic = rspamd_lua_callback_magic;
        cd->cb_is_ref = TRUE;
        cd->callback.ref = ref;
        cd->L = L;
index d80b11f1ff7e5451880d7aa60f02bc480adcbdfc..deb5adab541542275c30a641b334a567e2b3c4df 100644 (file)
 #include "libutil/map.h"
 #include "lua/lua_common.h"
 
+static const guint64 rspamd_regexp_cb_magic = 0xca9d9649fc3e2659ULL;
+
 struct regexp_module_item {
+       guint64 magic;
        struct rspamd_expression *expr;
        const gchar *symbol;
        struct ucl_lua_funcdata *lua_function;
@@ -151,6 +154,8 @@ regexp_module_config (struct rspamd_config *cfg)
                        cur_item = rspamd_mempool_alloc0 (regexp_module_ctx->regexp_pool,
                                        sizeof (struct regexp_module_item));
                        cur_item->symbol = ucl_object_key (value);
+                       cur_item->magic = rspamd_regexp_cb_magic;
+
                        if (!read_regexp_expression (regexp_module_ctx->regexp_pool,
                                cur_item, ucl_object_key (value),
                                ucl_obj_tostring (value), cfg)) {
@@ -170,8 +175,10 @@ regexp_module_config (struct rspamd_config *cfg)
                        /* Just a lua function */
                        cur_item = rspamd_mempool_alloc0 (regexp_module_ctx->regexp_pool,
                                        sizeof (struct regexp_module_item));
+                       cur_item->magic = rspamd_regexp_cb_magic;
                        cur_item->symbol = ucl_object_key (value);
                        cur_item->lua_function = ucl_object_toclosure (value);
+
                        rspamd_symbols_cache_add_symbol (cfg->cache,
                                cur_item->symbol,
                                0,
@@ -199,6 +206,8 @@ regexp_module_config (struct rspamd_config *cfg)
                                        cur_item = rspamd_mempool_alloc0 (regexp_module_ctx->regexp_pool,
                                                        sizeof (struct regexp_module_item));
                                        cur_item->symbol = ucl_object_key (value);
+                                       cur_item->magic = rspamd_regexp_cb_magic;
+
                                        if (!read_regexp_expression (regexp_module_ctx->regexp_pool,
                                                        cur_item, ucl_object_key (value),
                                                        ucl_obj_tostring (elt), cfg)) {
@@ -221,6 +230,7 @@ regexp_module_config (struct rspamd_config *cfg)
                                cur_item = rspamd_mempool_alloc0 (
                                                regexp_module_ctx->regexp_pool,
                                                sizeof (struct regexp_module_item));
+                               cur_item->magic = rspamd_regexp_cb_magic;
                                cur_item->symbol = ucl_object_key (value);
                                cur_item->lua_function = ucl_object_toclosure (value);
                        }
index ad2c3be9cf097d18ef9081fa443545817a083b08..3034a9f4731dff760f7b708d5431052a309cc8e0 100644 (file)
@@ -43,6 +43,7 @@
 #include "unix-std.h"
 
 static struct surbl_ctx *surbl_module_ctx = NULL;
+static const guint64 rspamd_surbl_cb_magic = 0xe09b8536f80de0d1ULL;
 
 static void surbl_test_url (struct rspamd_task *task, void *user_data);
 static void surbl_dns_callback (struct rdns_reply *reply, gpointer arg);
@@ -57,6 +58,7 @@ static void process_dns_results (struct rspamd_task *task,
 #define WHITELIST_ERROR 0
 #define CONVERSION_ERROR 1
 #define DUPLICATE_ERROR 1
+
 GQuark
 surbl_error_quark (void)
 {
@@ -600,8 +602,10 @@ surbl_module_config (struct rspamd_config *cfg)
                                                "definition");
                                continue;
                        }
+
                        new_suffix = rspamd_mempool_alloc0 (surbl_module_ctx->surbl_pool,
                                        sizeof (struct suffix_item));
+                       new_suffix->magic = rspamd_surbl_cb_magic;
                        new_suffix->suffix = rspamd_mempool_strdup (
                                surbl_module_ctx->surbl_pool,
                                ucl_obj_tostring (cur));
index 68b27c3f08ea119f14301319ae5323b02c5f6d68..69d7d6166f8143c3279781ccccaf893f9ea85364 100644 (file)
@@ -41,6 +41,7 @@ struct surbl_ctx {
 };
 
 struct suffix_item {
+       guint64 magic;
        const gchar *suffix;
        const gchar *symbol;
        guint32 options;