aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/composites/composites.cxx10
-rw-r--r--src/libserver/dkim.c10
-rw-r--r--src/libserver/maps/map_private.h8
-rw-r--r--src/libserver/milter.c8
-rw-r--r--src/libserver/monitored.c10
-rw-r--r--src/libserver/re_cache.c10
-rw-r--r--src/libserver/spf.c10
-rw-r--r--src/libserver/ssl_util.c2
-rw-r--r--src/libserver/symcache/symcache_c.cxx63
-rw-r--r--src/libserver/symcache/symcache_impl.cxx54
-rw-r--r--src/libserver/symcache/symcache_item.cxx9
-rw-r--r--src/libserver/symcache/symcache_item.hxx18
-rw-r--r--src/libserver/symcache/symcache_runtime.cxx16
13 files changed, 153 insertions, 75 deletions
diff --git a/src/libserver/composites/composites.cxx b/src/libserver/composites/composites.cxx
index f1d742ca9..3b5b274a7 100644
--- a/src/libserver/composites/composites.cxx
+++ b/src/libserver/composites/composites.cxx
@@ -31,20 +31,20 @@
#define msg_err_composites(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
"composites", task->task_pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_warn_composites(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
"composites", task->task_pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_info_composites(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
"composites", task->task_pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_composites(...) rspamd_conditional_debug_fast (NULL, task->from_addr, \
rspamd_composites_log_id, "composites", task->task_pool->tag.uid, \
- __FUNCTION__, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
INIT_LOG_MODULE(composites)
@@ -802,6 +802,8 @@ composites_foreach_callback(gpointer key, gpointer value, void *data)
cd->composite = comp;
task = cd->task;
+ msg_debug_composites("process composite %s", str_key);
+
if (!cd->checked[cd->composite->id * 2]) {
if (rspamd_symcache_is_checked(cd->task, cd->task->cfg->cache,
str_key)) {
diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c
index 4bf96b1b6..4d32dd8fd 100644
--- a/src/libserver/dkim.c
+++ b/src/libserver/dkim.c
@@ -68,23 +68,23 @@ enum rspamd_dkim_param_type {
#define msg_err_dkim(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
"dkim", ctx->pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_warn_dkim(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
"dkim", ctx->pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_info_dkim(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
"dkim", ctx->pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_dkim(...) rspamd_conditional_debug_fast (NULL, NULL, \
rspamd_dkim_log_id, "dkim", ctx->pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_dkim_taskless(...) rspamd_conditional_debug_fast (NULL, NULL, \
rspamd_dkim_log_id, "dkim", "", \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
INIT_LOG_MODULE(dkim)
diff --git a/src/libserver/maps/map_private.h b/src/libserver/maps/map_private.h
index 4c0805e3a..74b2ea042 100644
--- a/src/libserver/maps/map_private.h
+++ b/src/libserver/maps/map_private.h
@@ -32,19 +32,19 @@ typedef void (*rspamd_map_tmp_dtor) (gpointer p);
extern guint rspamd_map_log_id;
#define msg_err_map(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
"map", map->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_warn_map(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
"map", map->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_info_map(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
"map", map->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_map(...) rspamd_conditional_debug_fast (NULL, NULL, \
rspamd_map_log_id, "map", map->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
enum fetch_proto {
diff --git a/src/libserver/milter.c b/src/libserver/milter.c
index 142f50c92..7b6fa78ea 100644
--- a/src/libserver/milter.c
+++ b/src/libserver/milter.c
@@ -32,19 +32,19 @@
#define msg_err_milter(...) rspamd_default_log_function(G_LOG_LEVEL_CRITICAL, \
"milter", priv->pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_warn_milter(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
"milter", priv->pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_info_milter(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
"milter", priv->pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_milter(...) rspamd_conditional_debug_fast (NULL, NULL, \
rspamd_milter_log_id, "milter", priv->pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
INIT_LOG_MODULE(milter)
diff --git a/src/libserver/monitored.c b/src/libserver/monitored.c
index 7743d1d7b..99fe64c49 100644
--- a/src/libserver/monitored.c
+++ b/src/libserver/monitored.c
@@ -77,23 +77,23 @@ struct rspamd_monitored {
#define msg_err_mon(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
"monitored", m->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_warn_mon(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
"monitored", m->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_info_mon(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
"monitored", m->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_notice_mon(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE, \
"monitored", m->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_mon(...) rspamd_conditional_debug_fast (NULL, NULL, \
rspamd_monitored_log_id, "monitored", m->tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
INIT_LOG_MODULE(monitored)
diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c
index 0428cfdc7..00246527e 100644
--- a/src/libserver/re_cache.c
+++ b/src/libserver/re_cache.c
@@ -52,24 +52,24 @@
#define msg_err_re_cache(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
"re_cache", cache->hash, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_warn_re_cache(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
"re_cache", cache->hash, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_info_re_cache(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
"re_cache", cache->hash, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_re_task(...) rspamd_conditional_debug_fast (NULL, NULL, \
rspamd_re_cache_log_id, "re_cache", task->task_pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_re_cache(...) rspamd_conditional_debug_fast (NULL, NULL, \
rspamd_re_cache_log_id, "re_cache", cache->hash, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
INIT_LOG_MODULE(re_cache)
diff --git a/src/libserver/spf.c b/src/libserver/spf.c
index 16a1c2579..29780dce5 100644
--- a/src/libserver/spf.c
+++ b/src/libserver/spf.c
@@ -100,23 +100,23 @@ struct rspamd_spf_library_ctx *spf_lib_ctx = NULL;
#define msg_err_spf(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
"spf", rec->task->task_pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_warn_spf(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
"spf", rec->task->task_pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_info_spf(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
"spf", rec->task->task_pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_spf(...) rspamd_conditional_debug_fast (NULL, rec->task->from_addr, \
rspamd_spf_log_id, "spf", rec->task->task_pool->tag.uid, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
#define msg_debug_spf_flatten(...) rspamd_conditional_debug_fast_num_id (NULL, NULL, \
rspamd_spf_log_id, "spf", (flat)->digest, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
INIT_LOG_MODULE(spf)
diff --git a/src/libserver/ssl_util.c b/src/libserver/ssl_util.c
index 0aa859dbf..d82d944b3 100644
--- a/src/libserver/ssl_util.c
+++ b/src/libserver/ssl_util.c
@@ -70,7 +70,7 @@ struct rspamd_ssl_connection {
#define msg_debug_ssl(...) rspamd_conditional_debug_fast (NULL, NULL, \
rspamd_ssl_log_id, "ssl", conn->log_tag, \
- G_STRFUNC, \
+ RSPAMD_LOG_FUNC, \
__VA_ARGS__)
static void rspamd_ssl_event_handler (gint fd, short what, gpointer ud);
diff --git a/src/libserver/symcache/symcache_c.cxx b/src/libserver/symcache/symcache_c.cxx
index d4ebf4be3..baec74622 100644
--- a/src/libserver/symcache/symcache_c.cxx
+++ b/src/libserver/symcache/symcache_c.cxx
@@ -70,6 +70,11 @@ rspamd_symcache_add_symbol(struct rspamd_symcache *cache,
{
auto *real_cache = C_API_SYMCACHE(cache);
+ /* Legacy stuff */
+ if (name == nullptr) {
+ name = "";
+ }
+
if (parent == -1) {
return real_cache->add_symbol_with_callback(name, priority, func, user_data, type);
}
@@ -97,11 +102,17 @@ rspamd_symcache_add_condition_delayed(struct rspamd_symcache *cache,
return TRUE;
}
-gint rspamd_symcache_find_symbol(struct rspamd_symcache *cache,
+gint
+rspamd_symcache_find_symbol(struct rspamd_symcache *cache,
const gchar *name)
{
auto *real_cache = C_API_SYMCACHE(cache);
+ /* Legacy stuff but used */
+ if (name == nullptr) {
+ return -1;
+ }
+
auto sym_maybe = real_cache->get_item_by_name(name, false);
if (sym_maybe != nullptr) {
@@ -111,7 +122,8 @@ gint rspamd_symcache_find_symbol(struct rspamd_symcache *cache,
return -1;
}
-gboolean rspamd_symcache_stat_symbol(struct rspamd_symcache *cache,
+gboolean
+rspamd_symcache_stat_symbol(struct rspamd_symcache *cache,
const gchar *name,
gdouble *frequency,
gdouble *freq_stddev,
@@ -218,6 +230,11 @@ const gchar *
rspamd_symcache_item_name(struct rspamd_symcache_item *item)
{
auto *real_item = C_API_SYMCACHE_ITEM(item);
+
+ if (real_item == nullptr) {
+ return 0;
+ }
+
return real_item->get_name().c_str();
}
@@ -225,6 +242,11 @@ gint
rspamd_symcache_item_flags(struct rspamd_symcache_item *item)
{
auto *real_item = C_API_SYMCACHE_ITEM(item);
+
+ if (real_item == nullptr) {
+ return 0;
+ }
+
return real_item->get_flags();
}
@@ -364,6 +386,10 @@ rspamd_symcache_disable_symbol(struct rspamd_task *task,
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
auto *real_cache = C_API_SYMCACHE(cache);
+ if (cache_runtime == nullptr) {
+ return FALSE;
+ }
+
return cache_runtime->disable_symbol(task, *real_cache, symbol);
}
@@ -375,6 +401,10 @@ rspamd_symcache_enable_symbol(struct rspamd_task *task,
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
auto *real_cache = C_API_SYMCACHE(cache);
+ if (cache_runtime == nullptr) {
+ return FALSE;
+ }
+
return cache_runtime->enable_symbol(task, *real_cache, symbol);
}
@@ -386,6 +416,10 @@ rspamd_symcache_is_checked(struct rspamd_task *task,
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
auto *real_cache = C_API_SYMCACHE(cache);
+ if (cache_runtime == nullptr) {
+ return FALSE;
+ }
+
return cache_runtime->is_symbol_checked(*real_cache, symbol);
}
@@ -396,6 +430,10 @@ rspamd_symcache_process_settings(struct rspamd_task *task,
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
auto *real_cache = C_API_SYMCACHE(cache);
+ if (cache_runtime == nullptr) {
+ return FALSE;
+ }
+
return cache_runtime->process_settings(task, *real_cache);
}
@@ -406,6 +444,10 @@ rspamd_symcache_is_item_allowed(struct rspamd_task *task,
{
auto *real_item = C_API_SYMCACHE_ITEM(item);
+ if (real_item == nullptr) {
+ return TRUE;
+ }
+
return real_item->is_allowed(task, exec_only);
}
@@ -417,6 +459,10 @@ rspamd_symcache_is_symbol_enabled(struct rspamd_task *task,
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
auto *real_cache = C_API_SYMCACHE(cache);
+ if (!cache_runtime) {
+ return TRUE;
+ }
+
return cache_runtime->is_symbol_enabled(task, *real_cache, symbol);
}
@@ -425,6 +471,10 @@ rspamd_symcache_get_cur_item(struct rspamd_task *task)
{
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
+ if (!cache_runtime) {
+ return nullptr;
+ }
+
return (struct rspamd_symcache_item *) cache_runtime->get_cur_item();
}
@@ -434,6 +484,10 @@ rspamd_symcache_set_cur_item(struct rspamd_task *task, struct rspamd_symcache_it
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
auto *real_item = C_API_SYMCACHE_ITEM(item);
+ if (!cache_runtime || !real_item) {
+ return nullptr;
+ }
+
return (struct rspamd_symcache_item *) cache_runtime->set_cur_item(real_item);
}
@@ -441,6 +495,9 @@ void
rspamd_symcache_enable_profile(struct rspamd_task *task)
{
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
+ if (!cache_runtime) {
+ return;
+ }
cache_runtime->set_profile_mode(true);
}
@@ -524,7 +581,7 @@ rspamd_symcache_composites_foreach(struct rspamd_task *task,
real_cache->composites_foreach([&](const auto *item) {
auto *dyn_item = cache_runtime->get_dynamic_item(item->id, false);
- if (dyn_item->started) {
+ if (!dyn_item->started) {
func((void *)item->get_name().c_str(), item->get_cbdata(), fd);
dyn_item->finished = true;
}
diff --git a/src/libserver/symcache/symcache_impl.cxx b/src/libserver/symcache/symcache_impl.cxx
index ab1b41fc4..f76188c9f 100644
--- a/src/libserver/symcache/symcache_impl.cxx
+++ b/src/libserver/symcache/symcache_impl.cxx
@@ -20,6 +20,7 @@
#include "symcache_runtime.hxx"
#include "unix-std.h"
#include "libutil/cxx/locked_file.hxx"
+#include "libutil/cxx/util.hxx"
#include "fmt/core.h"
#include "contrib/t1ha/t1ha.h"
@@ -35,10 +36,12 @@ auto symcache::init() -> bool
reload_time = cfg->cache_reload_time;
if (cfg->cache_filename != nullptr) {
+ msg_debug_cache("loading symcache saved data from %s", cfg->cache_filename);
res = load_items();
}
/* Deal with the delayed dependencies */
+ msg_debug_cache("resolving delayed dependencies: %d in list", (int)delayed_deps->size());
for (const auto &delayed_dep: *delayed_deps) {
auto virt_item = get_item_by_name(delayed_dep.from, false);
auto real_item = get_item_by_name(delayed_dep.from, true);
@@ -64,6 +67,7 @@ auto symcache::init() -> bool
/* Deal with the delayed conditions */
+ msg_debug_cache("resolving delayed conditions: %d in list", (int)delayed_conditions->size());
for (const auto &delayed_cond: *delayed_conditions) {
auto it = get_item_by_name_mut(delayed_cond.sym, true);
@@ -80,10 +84,13 @@ auto symcache::init() -> bool
delayed_cond.sym.c_str());
g_abort();
}
+
+ msg_debug_cache("added a condition to the symbol %s", it->symbol.c_str());
}
}
delayed_conditions.reset();
+ msg_debug_cache("process dependencies");
for (auto &it: items_by_id) {
it->process_deps(*this);
}
@@ -110,7 +117,7 @@ auto symcache::init() -> bool
return 1;
};
-
+ msg_debug_cache("sorting stuff");
std::stable_sort(std::begin(connfilters), std::end(connfilters), prefilters_cmp);
std::stable_sort(std::begin(prefilters), std::end(prefilters), prefilters_cmp);
std::stable_sort(std::begin(postfilters), std::end(postfilters), postfilters_cmp);
@@ -120,6 +127,7 @@ auto symcache::init() -> bool
/* Connect metric symbols with symcache symbols */
if (cfg->symbols) {
+ msg_debug_cache("connect metrics");
g_hash_table_foreach(cfg->symbols,
symcache::metric_connect_cb,
(void *) this);
@@ -417,7 +425,13 @@ auto symcache::add_dependency(int id_from, std::string_view to, int virtual_id_f
auto symcache::resort() -> void
{
- auto ord = std::make_shared<order_generation>(filters.size(), cur_order_gen);
+ auto ord = std::make_shared<order_generation>(filters.size() +
+ prefilters.size() +
+ composites.size() +
+ postfilters.size() +
+ idempotent.size() +
+ connfilters.size() +
+ classifiers.size(), cur_order_gen);
for (auto &it: filters) {
if (it) {
@@ -578,8 +592,7 @@ auto symcache::resort() -> void
append_items_vec(classifiers, ord->d);
/* After sorting is done, we can assign all elements in the by_symbol hash */
- for (auto i = 0; i < ord->size(); i++) {
- const auto &it = ord->d[i];
+ for (const auto [i, it] : rspamd::enumerate(ord->d)) {
ord->by_symbol[it->get_name()] = i;
ord->by_cache_id[it->id] = i;
}
@@ -623,7 +636,9 @@ auto symcache::add_symbol_with_callback(std::string_view name,
std::string static_string_name;
if (name.empty()) {
- static_string_name = fmt::format("AUTO_{}", (void *) func);
+ static_string_name = fmt::format("AUTO_{}_{}", (void *)func, user_data);
+ msg_warn_cache("trying to add an empty symbol name, convert it to %s",
+ static_string_name.c_str());
}
else {
static_string_name = name;
@@ -1027,24 +1042,21 @@ symcache::process_settings_elt(struct rspamd_config_settings_elt *elt) -> void
if (item != nullptr) {
if (item->is_virtual()) {
- if (!(item->flags & SYMBOL_TYPE_GHOST)) {
- auto *parent = get_item_by_name_mut(sym, true);
-
- if (parent) {
- if (elt->symbols_disabled &&
- ucl_object_lookup(elt->symbols_disabled, parent->symbol.data())) {
- msg_err_cache ("conflict in %s: cannot enable disabled symbol %s, "
- "wanted to enable symbol %s",
- elt->name, parent->symbol.data(), sym);
- continue;
- }
-
- parent->exec_only_ids.add_id(id, static_pool);
- msg_debug_cache ("allow just execution of symbol %s for settings %ud (%s)",
- parent->symbol.data(), id, elt->name);
+ auto *parent = get_item_by_name_mut(sym, true);
+
+ if (parent) {
+ if (elt->symbols_disabled &&
+ ucl_object_lookup(elt->symbols_disabled, parent->symbol.data())) {
+ msg_err_cache ("conflict in %s: cannot enable disabled symbol %s, "
+ "wanted to enable symbol %s",
+ elt->name, parent->symbol.data(), sym);
+ continue;
}
+
+ parent->exec_only_ids.add_id(id, static_pool);
+ msg_debug_cache ("allow just execution of symbol %s for settings %ud (%s)",
+ parent->symbol.data(), id, elt->name);
}
- /* Ignore ghosts */
}
item->allowed_ids.add_id(id, static_pool);
diff --git a/src/libserver/symcache/symcache_item.cxx b/src/libserver/symcache/symcache_item.cxx
index f78605b13..70c1921bb 100644
--- a/src/libserver/symcache/symcache_item.cxx
+++ b/src/libserver/symcache/symcache_item.cxx
@@ -300,7 +300,7 @@ auto cache_item::is_allowed(struct rspamd_task *task, bool exec_only) const -> b
}
if (!(flags & SYMBOL_TYPE_EXPLICIT_DISABLE)) {
- if (allowed_ids.check_id(task->settings_elt->id)) {
+ if (!allowed_ids.check_id(task->settings_elt->id)) {
if (task->settings_elt->policy == RSPAMD_SETTINGS_POLICY_IMPLICIT_ALLOW) {
msg_debug_cache_task("allow execution of %s settings id %ud "
@@ -472,14 +472,11 @@ auto item_condition::check(std::string_view sym_name, struct rspamd_task *task)
if (cb != -1 && L != nullptr) {
auto ret = false;
- lua_rawgeti(L, LUA_REGISTRYINDEX, cb);
-
lua_pushcfunction (L, &rspamd_lua_traceback);
auto err_idx = lua_gettop(L);
- auto **ptask = (struct rspamd_task **) lua_newuserdata(L, sizeof(struct rspamd_task *));
- rspamd_lua_setclass(L, "rspamd{task}", -1);
- *ptask = task;
+ lua_rawgeti(L, LUA_REGISTRYINDEX, cb);
+ rspamd_lua_task_push(L, task);
if (lua_pcall(L, 1, 1, err_idx) != 0) {
msg_info_task("call to condition for %s failed: %s",
diff --git a/src/libserver/symcache/symcache_item.hxx b/src/libserver/symcache/symcache_item.hxx
index 1d0cd7e35..89c00ded5 100644
--- a/src/libserver/symcache/symcache_item.hxx
+++ b/src/libserver/symcache/symcache_item.hxx
@@ -85,11 +85,21 @@ auto item_type_from_c(enum rspamd_symbol_type type) -> tl::expected<std::pair<sy
struct item_condition {
private:
- lua_State *L;
- int cb;
+ lua_State *L = nullptr;
+ int cb = -1;
public:
- item_condition(lua_State *_L, int _cb) : L(_L), cb(_cb) {}
- virtual ~item_condition();
+ explicit item_condition(lua_State *L_, int cb_) noexcept : L(L_), cb(cb_) {}
+ item_condition(item_condition &&other) noexcept {
+ *this = std::move(other);
+ }
+ /* Make it move only */
+ item_condition(const item_condition &) = delete;
+ item_condition& operator=(item_condition &&other) noexcept {
+ std::swap(other.L, L);
+ std::swap(other.cb, cb);
+ return *this;
+ }
+ ~item_condition();
auto check(std::string_view sym_name, struct rspamd_task *task) const -> bool;
};
diff --git a/src/libserver/symcache/symcache_runtime.cxx b/src/libserver/symcache/symcache_runtime.cxx
index 7ee8b9cd9..e09411845 100644
--- a/src/libserver/symcache/symcache_runtime.cxx
+++ b/src/libserver/symcache/symcache_runtime.cxx
@@ -119,6 +119,7 @@ symcache_runtime::process_settings(struct rspamd_task *task, const symcache &cac
const auto *enabled = ucl_object_lookup(task->settings, "symbols_enabled");
if (enabled) {
+ msg_debug_cache_task("disable all symbols as `symbols_enabled` is found");
/* Disable all symbols but selected */
disable_all_symbols(SYMBOL_TYPE_EXPLICIT_DISABLE);
already_disabled = true;
@@ -159,9 +160,8 @@ symcache_runtime::process_settings(struct rspamd_task *task, const symcache &cac
auto symcache_runtime::disable_all_symbols(int skip_mask) -> void
{
- for (auto i = 0; i < order->size(); i++) {
+ for (auto [i, item] : rspamd::enumerate(order->d)) {
auto *dyn_item = &dynamic_items[i];
- const auto &item = order->d[i];
if (!(item->get_flags() & skip_mask)) {
dyn_item->finished = true;
@@ -424,13 +424,14 @@ symcache_runtime::process_filters(struct rspamd_task *task, symcache &cache, int
auto all_done = true;
for (const auto [idx, item] : rspamd::enumerate(order->d)) {
- if (item->type == symcache_item_type::CLASSIFIER) {
+ /* Exclude all non filters */
+ if (item->type != symcache_item_type::FILTER) {
continue;
}
auto dyn_item = &dynamic_items[idx];
- if (!dyn_item->started && !dyn_item->finished) {
+ if (!dyn_item->started) {
all_done = false;
if (!check_item_deps(task, cache, item.get(),
@@ -438,7 +439,7 @@ symcache_runtime::process_filters(struct rspamd_task *task, symcache &cache, int
msg_debug_cache_task("blocked execution of %d(%s) unless deps are "
"resolved", item->id, item->symbol.c_str());
- break;
+ continue;
}
process_symbol(task, cache, item.get(), dyn_item);
@@ -447,7 +448,7 @@ symcache_runtime::process_filters(struct rspamd_task *task, symcache &cache, int
/* Delay */
has_slow = false;
- break;
+ return false;
}
}
@@ -508,13 +509,12 @@ symcache_runtime::process_symbol(struct rspamd_task *task, symcache &cache, cach
dyn_item->start_msec = (ev_now(task->event_loop) -
profile_start) * 1e3;
}
-
dyn_item->async_events = 0;
cur_item = item;
items_inflight++;
/* Callback now must finalize itself */
item->call(task);
- cur_item = NULL;
+ cur_item = nullptr;
if (items_inflight == 0) {
return true;