From: Vsevolod Stakhov Date: Fri, 13 Feb 2026 17:18:39 +0000 (+0000) Subject: [Fix] Preserve UNSCORED flag when config defines symbol without score X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3694f9f3f15d18a8abe7fa528ac344d3df5c3453;p=thirdparty%2Frspamd.git [Fix] Preserve UNSCORED flag when config defines symbol without score When rspamd_config_add_symbol was called for an existing symbol without a score (NAN), line 1811 unconditionally replaced all flags, clearing RSPAMD_SYMBOL_FLAG_UNSCORED. This caused Lua-registered scores to be ignored: if a symbol appeared in config (e.g. groups.conf) without a score, the UNSCORED flag was lost, and the Lua score-setting block in lua_config_register_symbol_from_table was skipped, leaving score at 0. Now flags are updated correctly in both cases: - Real score provided: flags fully replaced with UNSCORED cleared - NAN score: flags updated but UNSCORED preserved from existing symbol Also initialize score to NAN in lua_config_set_metric_symbol to avoid passing uninitialized stack garbage to rspamd_config_add_symbol. --- diff --git a/src/libserver/cfg_utils.cxx b/src/libserver/cfg_utils.cxx index a5871a87cc..420cc70ab3 100644 --- a/src/libserver/cfg_utils.cxx +++ b/src/libserver/cfg_utils.cxx @@ -1805,10 +1805,12 @@ rspamd_config_add_symbol(struct rspamd_config *cfg, *sym_def->weight_ptr = score; sym_def->score = score; sym_def->priority = priority; - sym_def->flags &= ~RSPAMD_SYMBOL_FLAG_UNSCORED; + sym_def->flags = flags & ~RSPAMD_SYMBOL_FLAG_UNSCORED; + } + else { + /* Preserve UNSCORED flag when not setting a real score */ + sym_def->flags = flags | (sym_def->flags & RSPAMD_SYMBOL_FLAG_UNSCORED); } - - sym_def->flags = flags; if (nshots != 0) { sym_def->nshots = nshots; diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c index b863e11d72..f07010d90f 100644 --- a/src/lua/lua_config.c +++ b/src/lua/lua_config.c @@ -2824,7 +2824,7 @@ lua_config_set_metric_symbol(lua_State *L) struct rspamd_config *cfg = lua_check_config(L, 1); const char *description = NULL, *group = NULL, *name = NULL, *flags_str = NULL; - double score; + double score = NAN; gboolean one_shot = FALSE, one_param = FALSE; GError *err = NULL; double priority = 0.0;