]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Keep groups_*/symbols_* fields in settings for runtime processing
authorVsevolod Stakhov <vsevolod@rspamd.com>
Wed, 12 Nov 2025 10:25:05 +0000 (10:25 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Wed, 12 Nov 2025 10:25:05 +0000 (10:25 +0000)
The Lua settings preprocessing was removing groups_disabled, groups_enabled,
symbols_disabled, and symbols_enabled fields from settings objects after
converting them to individual symbol lists. However, the C++ runtime code
(rspamd_symcache_process_settings) also needs these fields to mark symbols
as enabled/disabled in the runtime state.

Background:
- June 2019: Lua preprocessing added, removed fields to 'avoid clash'
- April 2022: C++ runtime process_settings() added, which reads these fields
- The two mechanisms were never properly synchronized

How settings work:
1. Lua preprocessing (at config load): Converts groups_* to symbol lists,
   registers via rspamd_config:register_settings_id(), creates settings_elt
   with allowed/forbidden symbol IDs for enforcement
2. C++ runtime (when settings applied): Reads task->settings UCL object,
   processes groups_*/symbols_* fields to mark symbols as finished/not_started
   in the runtime state for optimization

The issue:
When settings are applied via task:set_settings(cached.settings.apply),
the Lua table is converted to UCL and stored in task->settings. If the
groups_* fields were removed by preprocessing, process_settings() cannot
find them, so symbols don't get marked as disabled in runtime state.

The fix:
Don't remove these fields. Both mechanisms work complementarily:
- Settings element: Enforcement (checks allowed/forbidden IDs per symbol)
- Runtime processing: Optimization (marks symbols as finished to skip them)

This is safe because:
- The preprocessing still builds correct allowed/forbidden symbol lists
- The runtime processing reads the same fields and applies them correctly
- No conflict occurs - they work on different aspects (enforcement vs state)

Note: This affects settings IDs (static settings), not dynamic settings
applied directly via Settings={} header, which never went through the
removal step.

lualib/lua_settings.lua

index d6d24d67ee8a8d8c7ddfd16716846fdaea9f91e6..68b1a934dc3d25417946253969e94965b75f4f41 100644 (file)
@@ -114,11 +114,10 @@ local function register_settings_cb(from_postload)
 
       rspamd_config:register_settings_id(set.name, enabled_symbols, disabled_symbols)
 
-      -- Remove to avoid clash
-      s.symbols_disabled = nil
-      s.symbols_enabled = nil
-      s.groups_enabled = nil
-      s.groups_disabled = nil
+      -- Note: we do NOT remove groups_*/symbols_* here anymore, as the C++ runtime
+      -- needs them for processing settings when they are applied to tasks.
+      -- The preprocessing above builds the allowed/forbidden symbol lists for the
+      -- settings element, but the runtime also needs to mark symbols as disabled/enabled.
     end
 
     -- We now iterate over all symbols and check for allowed_ids/forbidden_ids