Skip to main content
🐛 Bug Fix Release

Rspamd 4.0.1

Patch Release with Layered Settings Merge, Fuzzy Dynamic Blocks, and Critical Bug Fixes

Added

  • Layered settings merge: Collect-then-merge flow replaces first-match-wins; layers are merged with per-field semantics (actions/scores override by higher layer, symbols union with conflict resolution); force_actions and force_symbols provide explicit override when layers conflict (#5959)
  • Weak dependencies in symcache: New disabled status distinguishes "disabled by settings" from "finished"; hard deps cascade-disable dependents while weak deps let them proceed — seven plugins annotated with correct dependency classification (#5959)
  • Fuzzy dynamic block API: worker:block_fuzzy_client(addr, prefix_len[, expire_ts[, reason]]) Lua method for runtime IP/CIDR blocking in fuzzy storage without config changes or restarts; custom response codes — 403 for ratelimits vs 503 for bans; ratelimit_whitelist check exposed to Lua (#5962)

🔧 Fixed

  • Proxy milter fd leak: Original fd was not closed after milter dup(), leaking one fd per milter connection and causing unbounded CLOSE_WAIT accumulation in production (regression in 4.0.0)
  • Proxy self-scan task timeout: Self-scan tasks incorrectly used the upstream wire timeout (e.g. 120s) instead of task_timeout (8s default), masking hung tasks
  • ARC AAR header parsing: Replace naive semicolon split with LPeg grammar that respects RFC 8601 comments (...) and quoted strings — fixes cv=fail on multi-hop ARC chains where i=N appeared inside comments (#5963, #5966)
  • Dynamic ban expiry: Fix ev_now() usage for correct monotonic time in dynamic block expiry
  • Settings flow: Fix dependency ordering in pre/postfilters and settings apply phase
  • Redis backend build: Add missing #include <memory> in redis_backend.cxx (#5960)