diff options
Diffstat (limited to 'src/libserver')
-rw-r--r-- | src/libserver/composites/composites.cxx | 10 | ||||
-rw-r--r-- | src/libserver/dkim.c | 10 | ||||
-rw-r--r-- | src/libserver/maps/map_private.h | 8 | ||||
-rw-r--r-- | src/libserver/milter.c | 8 | ||||
-rw-r--r-- | src/libserver/monitored.c | 10 | ||||
-rw-r--r-- | src/libserver/re_cache.c | 10 | ||||
-rw-r--r-- | src/libserver/spf.c | 10 | ||||
-rw-r--r-- | src/libserver/ssl_util.c | 2 | ||||
-rw-r--r-- | src/libserver/symcache/symcache_c.cxx | 63 | ||||
-rw-r--r-- | src/libserver/symcache/symcache_impl.cxx | 54 | ||||
-rw-r--r-- | src/libserver/symcache/symcache_item.cxx | 9 | ||||
-rw-r--r-- | src/libserver/symcache/symcache_item.hxx | 18 | ||||
-rw-r--r-- | src/libserver/symcache/symcache_runtime.cxx | 16 |
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; |