diff options
Diffstat (limited to 'src/libserver/rspamd_symcache.c')
-rw-r--r-- | src/libserver/rspamd_symcache.c | 104 |
1 files changed, 64 insertions, 40 deletions
diff --git a/src/libserver/rspamd_symcache.c b/src/libserver/rspamd_symcache.c index 831b98a3d..ecafae892 100644 --- a/src/libserver/rspamd_symcache.c +++ b/src/libserver/rspamd_symcache.c @@ -24,6 +24,7 @@ #include "contrib/t1ha/t1ha.h" #include "libserver/worker_util.h" #include "khash.h" +#include "utlist.h" #include <math.h> #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L @@ -97,6 +98,11 @@ struct rspamd_symcache_id_list { }; }; +struct rspamd_symcache_condition { + gint cb; + struct rspamd_symcache_condition *prev, *next; +}; + struct rspamd_symcache_item { /* This block is likely shared */ struct rspamd_symcache_item_stat *st; @@ -112,7 +118,7 @@ struct rspamd_symcache_item { struct { symbol_func_t func; gpointer user_data; - gint condition_cb; + struct rspamd_symcache_condition *conditions; } normal; struct { gint parent; @@ -712,7 +718,10 @@ rspamd_symcache_post_init (struct rspamd_symcache *cache) luaL_unref (dcond->L, LUA_REGISTRYINDEX, dcond->cbref); } else { - it->specific.normal.condition_cb = dcond->cbref; + struct rspamd_symcache_condition *ncond = rspamd_mempool_alloc0 (cache->static_pool, + sizeof (*ncond)); + ncond->cb = dcond->cbref; + DL_APPEND (it->specific.normal.conditions, ncond); } cur = g_list_next (cur); @@ -1134,7 +1143,7 @@ rspamd_symcache_add_symbol (struct rspamd_symcache *cache, item->specific.normal.func = func; item->specific.normal.user_data = user_data; - item->specific.normal.condition_cb = -1; + item->specific.normal.conditions = NULL; } else { /* @@ -1144,7 +1153,7 @@ rspamd_symcache_add_symbol (struct rspamd_symcache *cache, * - composite symbol */ if (item->type & SYMBOL_TYPE_COMPOSITE) { - item->specific.normal.condition_cb = -1; + item->specific.normal.conditions = NULL; item->specific.normal.user_data = user_data; g_assert (user_data != NULL); g_ptr_array_add (cache->composites, item); @@ -1162,7 +1171,7 @@ rspamd_symcache_add_symbol (struct rspamd_symcache *cache, item->is_filter = TRUE; item->specific.normal.func = NULL; item->specific.normal.user_data = NULL; - item->specific.normal.condition_cb = -1; + item->specific.normal.conditions = NULL; type_str = "classifier"; } else { @@ -1753,22 +1762,30 @@ rspamd_symcache_check_symbol (struct rspamd_task *task, if (!rspamd_symcache_is_item_allowed (task, item, TRUE)) { check = FALSE; } - else if (item->specific.normal.condition_cb != -1) { - /* We also executes condition callback to check if we need this symbol */ - L = task->cfg->lua_state; - lua_rawgeti (L, LUA_REGISTRYINDEX, item->specific.normal.condition_cb); - ptask = lua_newuserdata (L, sizeof (struct rspamd_task *)); - rspamd_lua_setclass (L, "rspamd{task}", -1); - *ptask = task; + else if (item->specific.normal.conditions) { + struct rspamd_symcache_condition *cur_cond; + + DL_FOREACH (item->specific.normal.conditions, cur_cond) { + /* We also executes condition callback to check if we need this symbol */ + L = task->cfg->lua_state; + lua_rawgeti (L, LUA_REGISTRYINDEX, cur_cond->cb); + ptask = lua_newuserdata (L, sizeof (struct rspamd_task *)); + rspamd_lua_setclass (L, "rspamd{task}", -1); + *ptask = task; + + if (lua_pcall (L, 1, 1, 0) != 0) { + msg_info_task ("call to condition for %s failed: %s", + item->symbol, lua_tostring (L, -1)); + lua_pop (L, 1); + } + else { + check = lua_toboolean (L, -1); + lua_pop (L, 1); + } - if (lua_pcall (L, 1, 1, 0) != 0) { - msg_info_task ("call to condition for %s failed: %s", - item->symbol, lua_tostring (L, -1)); - lua_pop (L, 1); - } - else { - check = lua_toboolean (L, -1); - lua_pop (L, 1); + if (!check) { + break; + } } if (!check) { @@ -2891,26 +2908,33 @@ rspamd_symcache_is_symbol_enabled (struct rspamd_task *task, ret = FALSE; } else { - if (item->specific.normal.condition_cb != -1) { - /* - * We also executes condition callback to check - * if we need this symbol - */ - L = task->cfg->lua_state; - lua_rawgeti (L, LUA_REGISTRYINDEX, - item->specific.normal.condition_cb); - ptask = lua_newuserdata (L, sizeof (struct rspamd_task *)); - rspamd_lua_setclass (L, "rspamd{task}", -1); - *ptask = task; - - if (lua_pcall (L, 1, 1, 0) != 0) { - msg_info_task ("call to condition for %s failed: %s", - item->symbol, lua_tostring (L, -1)); - lua_pop (L, 1); - } - else { - ret = lua_toboolean (L, -1); - lua_pop (L, 1); + if (item->specific.normal.conditions) { + struct rspamd_symcache_condition *cur_cond; + + DL_FOREACH (item->specific.normal.conditions, cur_cond) { + /* + * We also executes condition callback to check + * if we need this symbol + */ + L = task->cfg->lua_state; + lua_rawgeti (L, LUA_REGISTRYINDEX, cur_cond->cb); + ptask = lua_newuserdata (L, sizeof (struct rspamd_task *)); + rspamd_lua_setclass (L, "rspamd{task}", -1); + *ptask = task; + + if (lua_pcall (L, 1, 1, 0) != 0) { + msg_info_task ("call to condition for %s failed: %s", + item->symbol, lua_tostring (L, -1)); + lua_pop (L, 1); + } + else { + ret = lua_toboolean (L, -1); + lua_pop (L, 1); + } + + if (!ret) { + break; + } } } } |