]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Use finished status in disable_all_symbols
authorVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 31 Mar 2026 10:45:33 +0000 (11:45 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 31 Mar 2026 10:45:33 +0000 (11:45 +0100)
disable_all_symbols implements "disable all, then enable some"
for symbols_enabled/groups_enabled. Using `disabled` status here
caused cascade-disable of hard dependents: if an enabled symbol
depended on a non-enabled one, the enabled symbol was wrongly
cascade-disabled.

Revert to `finished` for disable_all_symbols. Reserve `disabled`
status for explicit symbol/group disable via settings rules
(disable_symbol), where cascade-disable IS the intended behavior.

src/libserver/symcache/symcache_runtime.cxx

index bc1ffc01c2d1a9e30179e89ff8c5f84e84d51c9f..d1ee45eed02b6526dd3b6cb5ce7b4aef306ccc08 100644 (file)
@@ -199,7 +199,13 @@ auto symcache_runtime::disable_all_symbols(int skip_mask) -> void
                auto *dyn_item = &dynamic_items[i];
 
                if (!(item->get_flags() & skip_mask)) {
-                       dyn_item->status = cache_item_status::disabled;
+                       /*
+                        * Use `finished` not `disabled`: this implements the "disable all,
+                        * then enable some" pattern from symbols_enabled/groups_enabled.
+                        * Using `disabled` would cascade-disable hard dependents, which is
+                        * wrong when an enabled symbol depends on a non-enabled one.
+                        */
+                       dyn_item->status = cache_item_status::finished;
                }
        }
 }