]> git.ipfire.org Git - thirdparty/rspamd.git/log
thirdparty/rspamd.git
3 weeks ago[Fix] Force GC after final batch to release all Redis connections 5737/head
Vsevolod Stakhov [Sat, 8 Nov 2025 21:35:31 +0000 (21:35 +0000)] 
[Fix] Force GC after final batch to release all Redis connections

Previously GC was skipped for the final batch (batch_end >= #results),
leaving those connections checked out. The subsequent DEL of idx_key
could hit the pool limit if batch_size was near the limit, leaving the
_processing key behind and exhausting the pool for the next date.

Now collectgarbage() runs after every batch including the last one,
ensuring all connections are released before the DEL operation.

3 weeks ago[Fix] Floor batch_size to integer to prevent fractional indexing
Vsevolod Stakhov [Sat, 8 Nov 2025 20:24:00 +0000 (20:24 +0000)] 
[Fix] Floor batch_size to integer to prevent fractional indexing

Use math.floor() to convert batch_size to integer before using in loops.
Fractional values like 1.5 would cause batch_start (e.g. 2.5) to index
results[] with non-integer, returning nil and crashing prepare_report()
with 'string expected, got nil'.

3 weeks ago[Fix] Normalize batch_size once in handler to fix both code paths
Vsevolod Stakhov [Sat, 8 Nov 2025 19:38:38 +0000 (19:38 +0000)] 
[Fix] Normalize batch_size once in handler to fix both code paths

Move batch_size validation to handler() right after argument parsing,
ensuring both process_report_date() and send_reports_by_smtp() use the
normalized value. Previously the validation was only in the Redis loop,
so send_reports_by_smtp() would still see invalid values (0 or negative),
causing nreports <= 0 which breaks sendmail callback scheduling and
prevents finish_cb from ever firing.

3 weeks ago[Fix] Validate batch_size to prevent loop error with invalid input
Vsevolod Stakhov [Sat, 8 Nov 2025 15:43:49 +0000 (15:43 +0000)] 
[Fix] Validate batch_size to prevent loop error with invalid input

Clamp batch_size to minimum of 1 to prevent Lua error 'bad for step'
when user provides --batch-size 0 or negative values. Previously this
would crash the tool; now it processes with batch_size=1.

3 weeks ago[Fix] Add batching and forced GC for Redis connections in dmarc_report
Vsevolod Stakhov [Sat, 8 Nov 2025 14:14:30 +0000 (14:14 +0000)] 
[Fix] Add batching and forced GC for Redis connections in dmarc_report

The coroutine version of lua_redis.request() creates connections that
are only released when Lua garbage collector runs. In tight loops
processing hundreds of domains, GC doesn't run frequently enough,
causing connection exhaustion.

Root cause: lua_redis.connect_sync() + conn:exec() returns connections
to Lua but relies on __gc metamethod for pool release. The connections
pile up until GC runs.

Solution:
- Process reports in batches (reuse existing --batch-size option)
- Force collectgarbage("collect") between batches to trigger __gc
- This ensures connections are properly released back to the pool

Each prepare_report() makes 3-4 Redis requests (EXISTS, RENAME,
ZRANGE, DEL), so batching + forced GC prevents parallel connection
buildup.

3 weeks ago[Minor] Use GPT-5 Codex for code reviews
Vsevolod Stakhov [Sat, 8 Nov 2025 13:50:54 +0000 (13:50 +0000)] 
[Minor] Use GPT-5 Codex for code reviews

Switch from Claude Sonnet to GPT-5 Codex model for code reviews to
provide different perspective from the model used for development.

3 weeks ago[Project] Restrict code review workflow to authorized maintainers
Vsevolod Stakhov [Sat, 8 Nov 2025 13:35:15 +0000 (13:35 +0000)] 
[Project] Restrict code review workflow to authorized maintainers

Limit '@droid review' trigger to only vstakhov, moisseev, and fatalbanana
to prevent unauthorized users from triggering expensive code review runs.

3 weeks ago[Project] Add GitHub Actions workflow for automated code review
Vsevolod Stakhov [Sat, 8 Nov 2025 13:26:25 +0000 (13:26 +0000)] 
[Project] Add GitHub Actions workflow for automated code review

Add Droid-powered code review triggered by '@droid review' comments on PRs.
Includes Rspamd-specific C/C++ guidelines:

- Memory management: mempool usage, leak detection
- C++20 standards, use ankerl::unordered_dense instead of std::unordered_map
- Lua integration: stack management, proper API usage
- Security: buffer overflows, DoS, injection vulnerabilities
- Concurrency and proper error handling

The workflow uses manual trigger to avoid noise on every PR update.

3 weeks agoMerge pull request #5732 from rspamd/vstakhov-llm-search-context
Vsevolod Stakhov [Fri, 7 Nov 2025 16:48:33 +0000 (16:48 +0000)] 
Merge pull request #5732 from rspamd/vstakhov-llm-search-context

[Feature] Add web search context support to GPT plugin

3 weeks ago[Rework] Refactor extract_specific_urls to prevent DoS and use hash-based deduplication 5732/head
Vsevolod Stakhov [Fri, 7 Nov 2025 16:17:20 +0000 (16:17 +0000)] 
[Rework] Refactor extract_specific_urls to prevent DoS and use hash-based deduplication

Replace tostring() with url:get_hash() throughout URL extraction to avoid
filling the Lua string interning table. Critical for handling malicious
messages with 100k+ URLs where each tostring() would create an interned
string causing memory exhaustion.

Key changes:
- Use dual data structure: array for results + hash set for O(1) dedup
- Add max_urls_to_process=50000 limit with warning for DoS protection
- Track url_index for stable sorting when priorities are equal
- Fix CTA priority preservation: prevent generic phished handling from
  overwriting CTA priorities which include phished/subject bonuses
- Add verbose flag to test suite for debugging

This ensures memory usage is strictly bounded regardless of malicious
input while maintaining correct URL prioritization for spam detection.

3 weeks ago[Fix] Skip HTML_DISPLAYED URLs in CTA detection
Vsevolod Stakhov [Fri, 7 Nov 2025 16:06:01 +0000 (16:06 +0000)] 
[Fix] Skip HTML_DISPLAYED URLs in CTA detection

HTML_DISPLAYED URLs are phishing bait text (display-only) and should
not be considered for CTA (call-to-action) detection. Only real link
targets should be analyzed for CTA purposes.

3 weeks ago[Minor] Update cache key prefix to match module name
Vsevolod Stakhov [Fri, 7 Nov 2025 15:55:20 +0000 (15:55 +0000)] 
[Minor] Update cache key prefix to match module name

Change cache_key_prefix from 'gpt_search' to 'llm_search' to align
with the module's current name (llm_search_context).

3 weeks ago[Feature] Add url:get_hash() method for efficient URL deduplication
Vsevolod Stakhov [Fri, 7 Nov 2025 15:46:43 +0000 (15:46 +0000)] 
[Feature] Add url:get_hash() method for efficient URL deduplication

Expose rspamd_cryptobox_fast_hash via Lua API to allow hash-based
URL deduplication without string conversion overhead. This is critical
for handling messages with large numbers of URLs (100k+) where tostring()
would fill the Lua string interning table and cause memory issues.

Returns 64-bit hash as Lua number, using the same hash function as
internal URL storage for consistency.

3 weeks ago[Rework] Prioritize CTA URLs in redirector and Lua helpers
Vsevolod Stakhov [Thu, 6 Nov 2025 18:22:08 +0000 (18:22 +0000)] 
[Rework] Prioritize CTA URLs in redirector and Lua helpers

3 weeks ago[Rework] Move CTA processing into dedicated module
Vsevolod Stakhov [Thu, 6 Nov 2025 13:46:50 +0000 (13:46 +0000)] 
[Rework] Move CTA processing into dedicated module

Also refactor all absurdic logic it has previously

3 weeks ago[Feature] Add task:get_cta_urls() API for proper CTA domain extraction
Vsevolod Stakhov [Thu, 6 Nov 2025 10:54:58 +0000 (10:54 +0000)] 
[Feature] Add task:get_cta_urls() API for proper CTA domain extraction

- C code (message.c): collect top CTA URLs per HTML part by button weight,
  store in task mempool variable "html_cta_urls"
- Lua API (lua_task.c): add task:get_cta_urls([max_urls]) method
- llm_search_context: use new API instead of reimplementing CTA logic in Lua
- Benefits: single source of truth for CTA logic, uses C knowledge of HTML
  structure and button weights, cleaner Lua code

This provides proper architecture where C code handles HTML structure analysis
and Lua adds domain filtering (blacklists, infrastructure domains, etc.)

3 weeks ago[Fix] Refactor llm_search_context to use lua_cache module
Vsevolod Stakhov [Wed, 5 Nov 2025 14:25:19 +0000 (14:25 +0000)] 
[Fix] Refactor llm_search_context to use lua_cache module

- Replace manual Redis operations with lua_cache API for better consistency
- Use messagepack serialization and automatic key hashing
- Fix Leta Mullvad API URL to /search/__data.json endpoint
- Add search_engine parameter support
- Remove redundant 'or DEFAULTS.xxx' patterns (opts already has defaults merged)
- Add proper debug_module propagation throughout call chain
- Improve JSON parsing to handle Leta Mullvad's nested pointer structure

3 weeks ago[Fix] Fix llm_search_context to follow Rspamd idioms
Vsevolod Stakhov [Wed, 5 Nov 2025 12:13:35 +0000 (12:13 +0000)] 
[Fix] Fix llm_search_context to follow Rspamd idioms

- Use local N = 'llm_search_context' idiom instead of constant string reuse
- Replace rspamd_logger.debugm with lua_util.debugm (rspamd_logger has no debugm method)
- Use extract_specific_urls instead of task:get_urls()
- Add task parameter to query_search_api for proper logging and HTTP requests
- Remove retry logic using non-existent rspamd_config:add_delayed_callback
- Simplify to single HTTP attempt with graceful failure
- Remove retry_count and retry_delay options from config

3 weeks ago[Feature] Add web search context support to GPT plugin
Vsevolod Stakhov [Wed, 5 Nov 2025 11:54:27 +0000 (11:54 +0000)] 
[Feature] Add web search context support to GPT plugin

- New module llm_search_context.lua: extracts domains from email URLs and queries search API
- Integrated into gpt.lua with parallel context fetching (user + search)
- Redis caching with configurable TTL (default 1 hour)
- Retry logic with exponential backoff for search API failures
- Disabled by default for backward compatibility
- Configuration options in gpt.conf for customization

3 weeks agoMerge pull request #5722 from rspamd/cursor/RSP-291-fix-dmarc-external-map-callback...
Vsevolod Stakhov [Wed, 5 Nov 2025 08:28:47 +0000 (08:28 +0000)] 
Merge pull request #5722 from rspamd/cursor/RSP-291-fix-dmarc-external-map-callback-0b4b

Fix dmarc external map callback

3 weeks agoMerge pull request #5725 from moisseev/feature/dark-mode
Vsevolod Stakhov [Tue, 4 Nov 2025 15:07:20 +0000 (15:07 +0000)] 
Merge pull request #5725 from moisseev/feature/dark-mode

[Feature] WebUI: Implement dark mode

3 weeks ago[Fix] Fix OpenBSD kinfo_proc structure member names
Vsevolod Stakhov [Tue, 4 Nov 2025 13:45:37 +0000 (13:45 +0000)] 
[Fix] Fix OpenBSD kinfo_proc structure member names

OpenBSD uses p_vm_* member names similar to NetBSD, not FreeBSD's ki_* names.
Separate OpenBSD implementation from FreeBSD to use correct structure members.

3 weeks ago[Fix] Disable Hyperscan on OpenBSD and fix zstd package name on FreeBSD
Vsevolod Stakhov [Tue, 4 Nov 2025 13:28:36 +0000 (13:28 +0000)] 
[Fix] Disable Hyperscan on OpenBSD and fix zstd package name on FreeBSD

- OpenBSD: Disable Hyperscan (not available), remove from dependencies
- FreeBSD: Fix zstd package name (zstd not libzstd)

3 weeks ago[Feature] Fix BSD workflow package installation and update OS versions
Vsevolod Stakhov [Tue, 4 Nov 2025 13:02:12 +0000 (13:02 +0000)] 
[Feature] Fix BSD workflow package installation and update OS versions

- FreeBSD: Add IGNORE_OSVERSION=yes to handle package version mismatches, update to 14.3/13.5
- OpenBSD: Set PKG_PATH for package repository, fix perl package name, update to 7.8/7.7/7.6
- Use latest stable versions of both operating systems

3 weeks agoMerge pull request #5718 from fatalbanana/sync_psl
Vsevolod Stakhov [Tue, 4 Nov 2025 12:48:02 +0000 (12:48 +0000)] 
Merge pull request #5718 from fatalbanana/sync_psl

Sync public suffix list automatically

3 weeks agoMerge pull request #5729 from rspamd/vstakhov-new-build-workflows
Vsevolod Stakhov [Tue, 4 Nov 2025 12:46:50 +0000 (12:46 +0000)] 
Merge pull request #5729 from rspamd/vstakhov-new-build-workflows

[Feature] Add/improve BSD build workflows with Lua version selection

3 weeks agoMerge pull request #5728 from rspamd/vstakhov-fix-spawn
Vsevolod Stakhov [Tue, 4 Nov 2025 12:46:04 +0000 (12:46 +0000)] 
Merge pull request #5728 from rspamd/vstakhov-fix-spawn

[Fix] Keep srv events active during shutdown to track auxiliary processes

3 weeks ago[Fix] Remove -j flag from ninja in all BSD workflows 5729/head
Vsevolod Stakhov [Tue, 4 Nov 2025 12:39:00 +0000 (12:39 +0000)] 
[Fix] Remove -j flag from ninja in all BSD workflows

Let ninja automatically determine optimal parallelism instead of
using sysctl which may not be available or in PATH on all BSD systems.

Ninja uses (CPU cores + 2) by default which is optimal for most cases.

3 weeks ago[Fix] NetBSD workflow: setup pkgin and PKG_PATH before installing packages
Vsevolod Stakhov [Tue, 4 Nov 2025 12:11:49 +0000 (12:11 +0000)] 
[Fix] NetBSD workflow: setup pkgin and PKG_PATH before installing packages

The pkg_add command requires PKG_PATH to be set in NetBSD 10.0.
Install and use pkgin for easier binary package management.

Changes:
- Set PKG_PATH to NetBSD CDN repository
- Install pkgin using /usr/sbin/pkg_add
- Use pkgin for all package installations
- Change perl5 to perl (correct package name)
- Add || true for non-critical package installation failures

3 weeks ago[Feature] Add/improve BSD build workflows with Lua version selection
Vsevolod Stakhov [Tue, 4 Nov 2025 12:01:10 +0000 (12:01 +0000)] 
[Feature] Add/improve BSD build workflows with Lua version selection

Add comprehensive GitHub Actions workflows for BSD systems with the ability
to select Lua version (LuaJIT, Lua 5.1, 5.3, 5.4).

NetBSD workflow improvements:
- Add Lua version selection (luajit, lua51, lua53, lua54)
- Fix missing dependencies (libarchive, zstd, xxhash, file)
- Remove || true from pkg_add to catch installation failures
- Add -DENABLE_HYPERSCAN=OFF (not available on NetBSD)
- Add -DSYSTEM_ZSTD=ON and -DSYSTEM_XXHASH=ON flags
- Add conditional ENABLE_LUAJIT based on Lua version selection
- Add NetBSD 9.4 to supported versions
- Fix test executable paths (add ./ prefix)

New FreeBSD workflow:
- Support FreeBSD 14.2, 13.4, 13.3
- Lua version selection (luajit, lua51, lua53, lua54)
- Full dependency list including hyperscan
- Enable hyperscan support (-DENABLE_HYPERSCAN=ON)
- Use system zstd and xxhash libraries
- Proper pkg update before installation

New OpenBSD workflow:
- Support OpenBSD 7.6, 7.5, 7.4
- Lua version selection (luajit, lua51, lua53)
- Full dependency list including hyperscan
- Enable hyperscan support
- Disable jemalloc (-DENABLE_JEMALLOC=OFF)
- Use OpenBSD-specific package names (icu4c, perl-5, lua%5.x)
- Use system zstd and xxhash libraries

All workflows:
- Use workflow_dispatch trigger for manual execution
- Allow selection of OS version and Lua version
- Use vmactions VMs for BSD testing
- Run both C++ and Lua unit tests
- Use Ninja build system for faster compilation

This provides comprehensive testing across different BSD platforms and
Lua versions, ensuring Rspamd builds correctly on various configurations.

3 weeks agoMerge pull request #5726 from rspamd/cursor/RSP-294-fix-rspamd-netbsd-build-breakage...
Vsevolod Stakhov [Tue, 4 Nov 2025 11:42:42 +0000 (11:42 +0000)] 
Merge pull request #5726 from rspamd/cursor/RSP-294-fix-rspamd-netbsd-build-breakage-bbbf

Fix rspamd netbsd build breakage

3 weeks ago[Minor] Address review comments 5726/head
Vsevolod Stakhov [Tue, 4 Nov 2025 11:38:10 +0000 (11:38 +0000)] 
[Minor] Address review comments

3 weeks ago[Minor] WebUI: Add comment for removeEventListener 5725/head
Alexander Moisseev [Tue, 4 Nov 2025 11:21:26 +0000 (14:21 +0300)] 
[Minor] WebUI: Add comment for removeEventListener

Document that unconditional removeEventListener call is safe per MDN spec.

3 weeks agoPotential fix for code scanning alert no. 176: Workflow does not contain permissions
Vsevolod Stakhov [Tue, 4 Nov 2025 11:08:05 +0000 (11:08 +0000)] 
Potential fix for code scanning alert no. 176: Workflow does not contain permissions

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
3 weeks agoAdd NetBSD build workflow
Cursor Agent [Tue, 4 Nov 2025 11:06:43 +0000 (11:06 +0000)] 
Add NetBSD build workflow

Co-authored-by: v <v@rspamd.com>
3 weeks ago[Fix] Keep srv events active during shutdown to track auxiliary processes 5728/head
Vsevolod Stakhov [Tue, 4 Nov 2025 10:54:06 +0000 (10:54 +0000)] 
[Fix] Keep srv events active during shutdown to track auxiliary processes

When Rspamd shuts down with auxiliary processes running (e.g., neural network
training spawned by workers), the main process was stopping srv_pipe event
handlers immediately after sending SIGTERM to workers. This prevented workers
from sending RSPAMD_SRV_ON_FORK notifications when their auxiliary child
processes terminated, causing these children to remain tracked indefinitely.

The main process would then hang for 90 seconds waiting for already-dead
processes that it couldn't properly clean up from the workers hash table.

Root cause analysis:
- Direct workers have ev_child watchers and are removed via SIGCHLD handler
- Auxiliary processes (fork from workers) have NO ev_child watchers
- They are removed ONLY via srv_pipe notifications (RSPAMD_SRV_ON_FORK)
- Stopping srv events during shutdown breaks this notification channel

The original stop_srv_ev code was added in 2019 (commit eafdd221) to avoid
"false notifications" during a major refactoring. However, this is no longer
an issue because:
1. srv_ev handlers automatically stop on EOF when worker pipes close
2. There is no risk of duplicate notifications
3. Auxiliary processes critically need these events to report termination

Solution: Remove the stop_srv_ev call from rspamd_term_handler. This allows
workers to continue sending process termination notifications during shutdown.
The srv_ev handlers will stop naturally when workers close their pipes.

Fixes: #5689, #5694
3 weeks agofeat: Add NetBSD memory usage support
Cursor Agent [Tue, 4 Nov 2025 10:24:00 +0000 (10:24 +0000)] 
feat: Add NetBSD memory usage support

Co-authored-by: v <v@rspamd.com>
3 weeks ago[Minor] WebUI: Fix theme toggle default to 'auto'
Alexander Moisseev [Tue, 4 Nov 2025 10:16:06 +0000 (13:16 +0300)] 
[Minor] WebUI: Fix theme toggle default to 'auto'

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
3 weeks ago[Feature] WebUI: Implement dark mode
Alexander Moisseev [Sun, 2 Nov 2025 13:14:21 +0000 (16:14 +0300)] 
[Feature] WebUI: Implement dark mode

3 weeks agoMerge pull request #5724 from rspamd/vstakhov-hyperscan-version
Vsevolod Stakhov [Mon, 3 Nov 2025 18:36:49 +0000 (18:36 +0000)] 
Merge pull request #5724 from rspamd/vstakhov-hyperscan-version

[Fix] Use runtime Hyperscan version for database validation

3 weeks ago[Fix] Recreate invalid unserialized Hyperscan cache files on version mismatch 5724/head
Vsevolod Stakhov [Mon, 3 Nov 2025 14:50:16 +0000 (14:50 +0000)] 
[Fix] Recreate invalid unserialized Hyperscan cache files on version mismatch

When Hyperscan library is updated, previously cached .unser files become
invalid due to version mismatch. Previously, these files would remain
unusable, forcing fallback to slower deserialization on every load.

This commit adds automatic detection and recreation of invalid unserialized
files:
- Extract file creation logic into create_unserialized_file() helper function
- Add error handler that deletes and recreates invalid .unser files
- Maintain file locking protection against concurrent process access
- Fall back to serialized version if recreation fails

This ensures cache files are automatically updated after Hyperscan upgrades
while protecting against race conditions in multi-process environments.

3 weeks ago[Fix] Use runtime Hyperscan version instead of compile-time version for database...
Vsevolod Stakhov [Mon, 3 Nov 2025 11:05:31 +0000 (11:05 +0000)] 
[Fix] Use runtime Hyperscan version instead of compile-time version for database validation

The issue was that the database version check used HS_DB_VERSION macro defined
in headers at compile time, while Hyperscan .so library writes the version from
its own headers. When the system updates the Hyperscan package but Rspamd isn't
recompiled, this causes a version mismatch and database validation fails.

The fix calls hs_version() at runtime to get the actual library version and uses
that for validation instead. This ensures compatibility when the Hyperscan library
is updated independently.

3 weeks ago[Fix] Fix allocator mismatches with jemalloc
Vsevolod Stakhov [Sun, 2 Nov 2025 19:29:38 +0000 (19:29 +0000)] 
[Fix] Fix allocator mismatches with jemalloc

Resolve crashes caused by mixing system malloc and jemalloc allocators.
The issue occurred when getline() and hiredis used system malloc, but
rspamd's free() used jemalloc, causing segmentation faults on macOS and
potentially other platforms.

Changes:
- Add rspamd_getline() wrapper using g_malloc/g_realloc/g_free to avoid
  system malloc in getline()
- Replace getline() with rspamd_getline() in url.c, dns.c, lua_repl.c
- Fix memory leak in lua_repl.c by freeing input buffer on exit
- Configure hiredis allocators to use glib functions (jemalloc) in
  rspamd_init_libs()

This ensures all memory operations use the same allocator (jemalloc)
throughout rspamd, preventing allocator mismatch crashes.

4 weeks agoMerge pull request #5721 from rspamd/cursor/RSP-284-fix-rspamd-nameserver-round-robin...
Vsevolod Stakhov [Sun, 2 Nov 2025 07:59:50 +0000 (07:59 +0000)] 
Merge pull request #5721 from rspamd/cursor/RSP-284-fix-rspamd-nameserver-round-robin-294a

Fix rspamd nameserver round robin

4 weeks ago[Fix] Fix allocator mismatches in libucl
Vsevolod Stakhov [Sat, 1 Nov 2025 22:14:07 +0000 (22:14 +0000)] 
[Fix] Fix allocator mismatches in libucl

Resolve crashes caused by mixing jemalloc and system malloc allocators
in libucl. The issue occurred when memory allocated with one allocator
(e.g., strdup using system malloc) was freed with another (e.g., jemalloc's
free), causing segmentation faults.

Changes:
- Add UCL_REALLOC and UCL_STRDUP macros to ucl.h for consistent allocation
- Replace all strdup/malloc/realloc/free calls with UCL_* macros in:
  - Variable and macro registration (ucl_parser.c)
  - Parser state management (ucl_util.c)
  - Object copying and trash stack operations (ucl_util.c)
  - URL fetching - fix critical bug where malloc'd buffers were freed
    with ucl_munmap (munmap) instead of free (ucl_util.c)

This ensures all memory operations use the same allocator throughout libucl,
preventing allocator mismatch crashes on systems using jemalloc.

4 weeks agoRefactor DMARC reporting to use helper functions and async maps 5722/head
Cursor Agent [Sat, 1 Nov 2025 12:58:16 +0000 (12:58 +0000)] 
Refactor DMARC reporting to use helper functions and async maps

Co-authored-by: v <v@rspamd.com>
4 weeks ago[Fix] Fix rspamd nameserver round-robin when using /etc/resolv.conf 5721/head
Cursor Agent [Sat, 1 Nov 2025 12:56:18 +0000 (12:56 +0000)] 
[Fix] Fix rspamd nameserver round-robin when using /etc/resolv.conf

When nameservers are parsed from /etc/resolv.conf, rspamd was setting
the upstream rotation strategy to RSPAMD_UPSTREAM_MASTER_SLAVE, which
caused it to only use the first nameserver unless it failed.

This behavior was inconsistent with the documented round-robin strategy
and with the behavior when nameservers are explicitly configured via
the configuration file.

Fixed by changing the rotation strategy to RSPAMD_UPSTREAM_ROUND_ROBIN
when parsing /etc/resolv.conf, matching the expected behavior.

Fixes RSP-284

4 weeks agoMerge pull request #5720 from rspamd/vstakhov-fuzzy-html-conf
Vsevolod Stakhov [Sat, 1 Nov 2025 12:21:57 +0000 (12:21 +0000)] 
Merge pull request #5720 from rspamd/vstakhov-fuzzy-html-conf

Add structured fuzzy checks configuration

4 weeks ago[Minor] Fix ping command 5720/head
Vsevolod Stakhov [Sat, 1 Nov 2025 12:02:46 +0000 (12:02 +0000)] 
[Minor] Fix ping command

4 weeks ago[Minor] Use khash instead of GHashTable in fuzzy_check.c
Vsevolod Stakhov [Sat, 1 Nov 2025 11:01:10 +0000 (11:01 +0000)] 
[Minor] Use khash instead of GHashTable in fuzzy_check.c

4 weeks ago[Feature] Add structured fuzzy checks configuration
Vsevolod Stakhov [Thu, 30 Oct 2025 20:46:41 +0000 (20:46 +0000)] 
[Feature] Add structured fuzzy checks configuration

- support new checks object while preserving legacy flags

- update lua helper and default config example to leverage structured checks

4 weeks agoMerge pull request #5690 from heptalium/meissner-update-lua-docu
Vsevolod Stakhov [Fri, 31 Oct 2025 18:26:50 +0000 (18:26 +0000)] 
Merge pull request #5690 from heptalium/meissner-update-lua-docu

Add missing parameters to documentation of rspamd_config:register_symbol function

4 weeks agoMerge pull request #5717 from moisseev/webui
Vsevolod Stakhov [Thu, 30 Oct 2025 20:46:16 +0000 (20:46 +0000)] 
Merge pull request #5717 from moisseev/webui

[Minor] Replace deprecated `alert-error` class and update D3 libs

4 weeks ago[Feature] Allow HTML-only fuzzy rules
Vsevolod Stakhov [Thu, 30 Oct 2025 18:43:01 +0000 (18:43 +0000)] 
[Feature] Allow HTML-only fuzzy rules

- add per-rule text_hashes toggle so HTML shingles can stand alone

- adjust lua/C logic and move HTML example into main fuzzy config

4 weeks ago[Test] Sync public suffix list automatically 5718/head
Andrew Lewis [Thu, 30 Oct 2025 18:07:52 +0000 (20:07 +0200)] 
[Test] Sync public suffix list automatically

4 weeks ago[Minor] Replace deprecated `alert-error` class 5717/head
Alexander Moisseev [Thu, 30 Oct 2025 10:50:53 +0000 (13:50 +0300)] 
[Minor] Replace deprecated `alert-error` class

Replaces the old Bootstrap 2.x `alert-error` class with the modern
`alert-danger` equivalent.

Also removes unused `.alert h4` rules that are no longer used in the UI.

This improves compatibility and ensures consistent styling with Bootstrap ≥3.

4 weeks ago[Minor] Update libucl with automatic stack management
Vsevolod Stakhov [Thu, 30 Oct 2025 10:17:31 +0000 (10:17 +0000)] 
[Minor] Update libucl with automatic stack management

Merge changes from upstream libucl commit 26bec99:
- Add UCL_STACK_AUTOMATIC flag for automatic stack preservation
- Modify stack cleanup to conditionally preserve automatic stacks
- Enable parsing of included files without outer braces

This allows parsing of UCL configurations that include files with
content like 'key = value;' without requiring explicit braces,
improving compatibility with various UCL file formats.

4 weeks agoMerge pull request #5714 from rspamd/cursor/RSP-290-fix-bayes-expiry-module-not-enabl...
Vsevolod Stakhov [Thu, 30 Oct 2025 09:08:13 +0000 (09:08 +0000)] 
Merge pull request #5714 from rspamd/cursor/RSP-290-fix-bayes-expiry-module-not-enabled-bug-63ff

Fix bayes_expiry module not enabled bug

4 weeks ago[Minor] Update bundled D3-based visualization libs
Alexander Moisseev [Thu, 30 Oct 2025 07:53:15 +0000 (10:53 +0300)] 
[Minor] Update bundled D3-based visualization libs

- **D3Evolution** 2.0.2 → 2.0.3
  Improves flexibility for different themes.
- **rspamd-D3Pie** 1.1.0 → 1.1.1
  Fixes a bug where the color was not applied to the label of the placeholder slice.

4 weeks agoMerge pull request #5716 from rspamd/fix-tcp-dns-garbage
Vsevolod Stakhov [Wed, 29 Oct 2025 18:20:24 +0000 (18:20 +0000)] 
Merge pull request #5716 from rspamd/fix-tcp-dns-garbage

[Fix] Fix TCP DNS uninitialized memory leak

4 weeks agoMerge pull request #5709 from rspamd/vstakhov-leaks-plug
Vsevolod Stakhov [Wed, 29 Oct 2025 13:56:49 +0000 (13:56 +0000)] 
Merge pull request #5709 from rspamd/vstakhov-leaks-plug

Plugging memory leaks

Burn test successful

4 weeks ago[Fix] Fix TCP DNS uninitialized memory leak 5716/head
Vsevolod Stakhov [Wed, 29 Oct 2025 13:45:38 +0000 (13:45 +0000)] 
[Fix] Fix TCP DNS uninitialized memory leak

When rescheduling a DNS request from UDP to TCP, the code was using
req->packet_len (allocated buffer size) instead of req->pos (actual
packet size) to copy and send the DNS packet. This caused random
garbage from uninitialized memory to be appended to TCP DNS queries.

The bug was particularly noticeable with short queries like TXT records,
where the allocated buffer could be 2-3x larger than the actual packet.

4 weeks agoRefactor: Improve Redis server discovery for Bayes 5714/head
Cursor Agent [Wed, 29 Oct 2025 13:14:54 +0000 (13:14 +0000)] 
Refactor: Improve Redis server discovery for Bayes

Co-authored-by: v <v@rspamd.com>
4 weeks ago[Minor] One more leak fix 5709/head
Vsevolod Stakhov [Wed, 29 Oct 2025 12:34:57 +0000 (12:34 +0000)] 
[Minor] One more leak fix

4 weeks ago[Feature] Add ASAN leak analyzer script
Vsevolod Stakhov [Wed, 29 Oct 2025 11:19:25 +0000 (11:19 +0000)] 
[Feature] Add ASAN leak analyzer script

4 weeks ago[Minor] Fix logger order finalization
Vsevolod Stakhov [Wed, 29 Oct 2025 10:51:14 +0000 (10:51 +0000)] 
[Minor] Fix logger order finalization

4 weeks ago[Minor] Fix double free in fuzzy storage
Vsevolod Stakhov [Wed, 29 Oct 2025 10:19:18 +0000 (10:19 +0000)] 
[Minor] Fix double free in fuzzy storage

4 weeks ago[Fix] Fix memory leak in fuzzy storage khash tables
Vsevolod Stakhov [Tue, 28 Oct 2025 15:51:51 +0000 (15:51 +0000)] 
[Fix] Fix memory leak in fuzzy storage khash tables

In init_fuzzy(), two khash tables were created but their destructors
were not added to the config mempool:
- ctx->default_forbidden_ids
- ctx->weak_ids

While these tables were destroyed in the worker cleanup code (before
exit), this cleanup doesn't run during configtest, causing a memory leak.

Fix: Add mempool destructors for both hash tables, similar to how
ctx->keys and ctx->errors_ips are handled. This ensures proper cleanup
in all scenarios including configtest.

4 weeks ago[Fix] Fix memory leak in address parsing for *-any addresses
Vsevolod Stakhov [Tue, 28 Oct 2025 15:01:21 +0000 (15:01 +0000)] 
[Fix] Fix memory leak in address parsing for *-any addresses

In rspamd_parse_host_port_priority(), when handling '*' (any address),
the GPtrArray was created with a conditional destructor:

    pool == NULL ? NULL : (GDestroyNotify) rspamd_inet_address_free

This meant that when pool == NULL, the array had NO destructor for
elements. Later, when rspamd_upstreams_add_upstream() copied addresses
and called g_ptr_array_free(addrs, TRUE), the original address objects
were not freed, causing a memory leak.

Fix: Always set the destructor to rspamd_inet_address_free, regardless
of pool presence. The destructor will properly free address elements
when the array is freed, while mempool destructor (if pool exists)
will handle freeing the array itself.

4 weeks ago[Fix] Fix memory leak in upstream address parsing
Vsevolod Stakhov [Tue, 28 Oct 2025 14:37:36 +0000 (14:37 +0000)] 
[Fix] Fix memory leak in upstream address parsing

When parsing upstream addresses in rspamd_upstreams_add_upstream(),
the GPtrArray 'addrs' was not properly freed in several cases:

1. For service= variant: destructor was not added to mempool
2. After copying addresses to upstream: array was not freed when
   ups->ctx is NULL
3. On parse failure: addrs was not freed

This commit adds proper cleanup:
- Add mempool destructor for service= variant when ctx exists
- Free addrs after copying addresses if no ctx (not managed by mempool)
- Free addrs on parse failure if not managed by mempool
- Set addrs = NULL after freeing to avoid dangling pointer

The fix is careful about mempool-managed vs manual cleanup to avoid
double-free issues, especially important since upstreams can be called
from destructor functions.

4 weeks ago[Rework] Add CFG_REF_* macros with debug logging for config refcounting
Vsevolod Stakhov [Tue, 28 Oct 2025 14:23:10 +0000 (14:23 +0000)] 
[Rework] Add CFG_REF_* macros with debug logging for config refcounting

Introduce specialized refcount macros for rspamd_config that provide
debug-level logging for better debugging of configuration lifecycle:

- CFG_REF_INIT_RETAIN: Initialize refcount to 1
- CFG_REF_RETAIN: Increment refcount
- CFG_REF_RELEASE: Decrement refcount and destroy if reaches 0

These macros use G_LOG_LEVEL_DEBUG to avoid cluttering info logs
with refcounting details, while still providing visibility when
debugging config lifetime issues.

Also update all workers and components to use the new CFG_REF_* macros
instead of generic REF_* macros for better tracking.

4 weeks ago[Refactor] Move OpenSSL providers from global to libs_ctx
Vsevolod Stakhov [Tue, 28 Oct 2025 11:30:28 +0000 (11:30 +0000)] 
[Refactor] Move OpenSSL providers from global to libs_ctx

Previously, OpenSSL 3.0+ providers (legacy and default) were stored in
static global variables. This is not a good architecture as these resources
should be managed alongside other library contexts.

This commit refactors the code to store SSL providers in the
rspamd_external_libs_ctx structure:
- Add ssl_legacy_provider and ssl_default_provider fields to libs_ctx
- Pass libs_ctx to rspamd_openssl_maybe_init() to store providers there
- Remove rspamd_openssl_cleanup() function - cleanup now happens in
  rspamd_deinit_libs() when the libs_ctx is freed
- Remove global variables and manual cleanup calls

This provides better resource management and clearer ownership of
OpenSSL provider lifecycle.

4 weeks agoFix UCL object memory leak in Lua integration
Vsevolod Stakhov [Tue, 28 Oct 2025 10:54:39 +0000 (10:54 +0000)] 
Fix UCL object memory leak in Lua integration

When UCL objects are passed to Lua via ucl_object_push_lua_unwrapped(),
the reference count is incremented but the garbage collector finalizer
was not being called, causing memory leaks.

The issue is that Lua 5.1/LuaJIT does not support __gc metamethod for
tables, only for userdata. This fix adds proper garbage collection
support for both Lua versions:

- For Lua 5.1/LuaJIT: Add __gc metamethod to the userdata stored in
  the table at index [0], which properly triggers reference cleanup
- For Lua 5.2+: Use the existing table __gc metamethod which works
  correctly in newer Lua versions

This ensures that ucl_object_unref() is called exactly once when the
Lua wrapper is garbage collected, preventing memory leaks.

4 weeks agoMerge pull request #5707 from fatalbanana/rspamadm_dnstool
Vsevolod Stakhov [Mon, 27 Oct 2025 17:39:38 +0000 (17:39 +0000)] 
Merge pull request #5707 from fatalbanana/rspamadm_dnstool

[Fix] Unbreak `rspamadm dnstool`

4 weeks agoMerge pull request #5701 from rspamd/vstakhov-learn-scripts-improvements
Vsevolod Stakhov [Mon, 27 Oct 2025 17:38:44 +0000 (17:38 +0000)] 
Merge pull request #5701 from rspamd/vstakhov-learn-scripts-improvements

[Rework] Make Bayes learn guards configurable

4 weeks ago[Fix] Unbreak `rspamadm dnstool` 5707/head
Andrew Lewis [Mon, 27 Oct 2025 16:11:23 +0000 (18:11 +0200)] 
[Fix] Unbreak `rspamadm dnstool`

4 weeks ago[Fix] Properly cleanup OpenSSL providers to prevent memory leak
Vsevolod Stakhov [Mon, 27 Oct 2025 12:45:34 +0000 (12:45 +0000)] 
[Fix] Properly cleanup OpenSSL providers to prevent memory leak

OpenSSL 3.0+ providers (legacy and default) were loaded but never
unloaded, causing memory leaks detected by ASAN. This commit adds
proper cleanup by:
- Saving provider pointers when loading
- Creating rspamd_openssl_cleanup() function to unload providers
- Calling cleanup on main process termination

5 weeks agoMerge pull request #5702 from moisseev/ft-fa
Vsevolod Stakhov [Sat, 25 Oct 2025 10:00:14 +0000 (11:00 +0100)] 
Merge pull request #5702 from moisseev/ft-fa

[Rework] WebUI: Replace Glyphicons with FontAwesome SVG icons

5 weeks ago[Minor] Fix icon rendering race condition in tab initialization 5702/head
Alexander Moisseev [Fri, 24 Oct 2025 13:41:35 +0000 (16:41 +0300)] 
[Minor] Fix icon rendering race condition in tab initialization

Initialize FontAwesome icon replacement before activating stickyTabs
to ensure FooTable icons are properly converted on initial tab load.

Previously, stickyTabs would activate #status_nav before the FontAwesome
MutationObserver was set up, causing icons to render as unstyled fooicons.

5 weeks ago[Rework] WebUI: Replace Glyphicons with FontAwesome SVG icons
Copilot [Fri, 24 Oct 2025 11:40:42 +0000 (14:40 +0300)] 
[Rework] WebUI: Replace Glyphicons with FontAwesome SVG icons

The implementation uses a global MutationObserver watching document.body that:

-  Detects when new fooicon elements are added to the DOM
-  Detects when class attributes change on existing fooicon elements (e.g., sort icon cycling)
-  Automatically processes and replaces icons

Benefits:

✓ Sharp SVG rendering at all zoom levels (vs blurry webfonts)
✓ No font loading issues or CORS problems
✓ Reduced code footprint

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: moisseev <2275981+moisseev@users.noreply.github.com>
5 weeks ago[Fix] Only bypass learn when header value matches 5701/head
Vsevolod Stakhov [Fri, 24 Oct 2025 10:41:29 +0000 (11:41 +0100)] 
[Fix] Only bypass learn when header value matches

5 weeks ago[Rework] Make Bayes learn guards configurable
Vsevolod Stakhov [Fri, 24 Oct 2025 10:20:53 +0000 (11:20 +0100)] 
[Rework] Make Bayes learn guards configurable

5 weeks ago[Minor] Reduce info log verbosity in fuzzy_check plugin
Vsevolod Stakhov [Thu, 23 Oct 2025 15:39:56 +0000 (16:39 +0100)] 
[Minor] Reduce info log verbosity in fuzzy_check plugin

Move routine TCP connection messages to debug level to reduce log noise.
Only log TCP/UDP protocol transitions at info level in auto-switch mode,
as these represent significant operational changes that administrators
should be aware of. Configuration and encryption key setup messages also
moved to debug level.

5 weeks ago[Fix] Add explicit console logging configuration for Docker container
Vsevolod Stakhov [Thu, 23 Oct 2025 10:45:11 +0000 (11:45 +0100)] 
[Fix] Add explicit console logging configuration for Docker container

Add logging.inc to ensure rspamd logs are properly captured by
Docker when running in foreground mode.

5 weeks ago[Fix] Use static encryption keys and improve log collection
Vsevolod Stakhov [Thu, 23 Oct 2025 10:23:20 +0000 (11:23 +0100)] 
[Fix] Use static encryption keys and improve log collection

- Replace dynamic key generation with static keys to avoid LD_LIBRARY_PATH issues
- Add fallback log collection using direct docker logs commands
- Ensure complete log capture from all containers

5 weeks ago[Minor] Another try to unbreak the integration test
Vsevolod Stakhov [Thu, 23 Oct 2025 10:10:22 +0000 (11:10 +0100)] 
[Minor] Another try to unbreak the integration test

5 weeks ago[Minor] I'm so tired of china room integration test
Vsevolod Stakhov [Thu, 23 Oct 2025 09:19:27 +0000 (10:19 +0100)] 
[Minor] I'm so tired of china room integration test

5 weeks ago[Fix] Use DESTDIR pattern to fix hardcoded paths in rspamd binaries
Vsevolod Stakhov [Thu, 23 Oct 2025 08:01:17 +0000 (09:01 +0100)] 
[Fix] Use DESTDIR pattern to fix hardcoded paths in rspamd binaries

Changed build to use CMAKE_INSTALL_PREFIX=/usr (final location) with
DESTDIR for staging. This ensures paths compiled into binaries match
runtime paths in Docker container, fixing lua_util module loading.

5 weeks ago[Fix] Copy all install directories to proper system locations in Dockerfile
Vsevolod Stakhov [Wed, 22 Oct 2025 15:20:46 +0000 (16:20 +0100)] 
[Fix] Copy all install directories to proper system locations in Dockerfile

Fixed the issue where config files and other resources were not accessible
because we were copying install/* to /usr/* which put configs at /usr/etc
instead of /etc. Now explicitly copying:
- install/bin -> /usr/bin (binaries)
- install/lib -> /usr/lib (libraries)
- install/share -> /usr/share (plugins, rules, webui)
- install/etc -> /etc (configuration files)

This ensures rspamd can find all its files at standard system locations.

5 weeks ago[Fix] Allow rspamd to run as root in Docker with --insecure flag
Vsevolod Stakhov [Wed, 22 Oct 2025 14:02:43 +0000 (15:02 +0100)] 
[Fix] Allow rspamd to run as root in Docker with --insecure flag

Rspamd refuses to run as root by default. Since this is a test
environment in an isolated Docker container, we add the --insecure
flag to allow running as root user.

5 weeks ago[Fix] Add missing runtime dependencies to Dockerfile
Vsevolod Stakhov [Wed, 22 Oct 2025 10:58:04 +0000 (11:58 +0100)] 
[Fix] Add missing runtime dependencies to Dockerfile

Added libsqlite3-0 and libunwind8 which are required by rspamd
but were missing from the Docker image, causing runtime errors:
  libsqlite3.so.0: cannot open shared object file

5 weeks ago[Fix] Add ldconfig and library path configuration to Dockerfile
Vsevolod Stakhov [Wed, 22 Oct 2025 10:26:14 +0000 (11:26 +0100)] 
[Fix] Add ldconfig and library path configuration to Dockerfile

The rspamd shared libraries are installed in /usr/lib/rspamd/ which is not
in the default dynamic linker search path. This causes the error:
  librspamd-server.so: cannot open shared object file

Fixed by:
- Adding /usr/lib/rspamd to /etc/ld.so.conf.d/rspamd.conf
- Running ldconfig to update the dynamic linker cache

This ensures all rspamd shared libraries are found at runtime.

5 weeks ago[Test] Use locally built Rspamd in integration tests instead of prebuilt image
Vsevolod Stakhov [Wed, 22 Oct 2025 10:13:18 +0000 (11:13 +0100)] 
[Test] Use locally built Rspamd in integration tests instead of prebuilt image

Changed integration test setup to build and test the current code
instead of using the asan-nightly Docker image:

- Modified docker-compose.yml to use local build via Dockerfile.local
- Created Dockerfile.local with ASAN-enabled Ubuntu 24.04 base
- Removed redundant docker-compose modification step from workflow
- Added .dockerignore to exclude test data from build context

This ensures integration tests actually test the code changes being
made in pull requests, not an outdated nightly build.

5 weeks ago[Fix] Fix critical TCP fuzzy protocol bugs
Vsevolod Stakhov [Wed, 22 Oct 2025 09:30:00 +0000 (10:30 +0100)] 
[Fix] Fix critical TCP fuzzy protocol bugs

This commit fixes three critical bugs in the TCP fuzzy implementation:

1. Heap-use-after-free in connection retry (fuzzy_check.c:782)
   - Removed redundant FUZZY_TCP_RELEASE() after g_ptr_array_remove()
   - The array's free function already handles unreferencing
   - This was causing double-free when retrying failed connections

2. TCP frame write calculation error (fuzzy_check.c:1088-1094)
   - Fixed data write length calculation that included 2-byte size header
   - Was writing 2 extra garbage bytes after payload
   - Server rejected frames with "invalid frame length" errors
   - Now correctly separates header and payload byte accounting

3. Server frame length validation (fuzzy_storage.c:2683)
   - Changed limit from sizeof(struct) to FUZZY_TCP_BUFFER_LENGTH (8192)
   - Commands with extensions exceed struct size but are valid
   - Added check for zero-length frames
   - Allows proper handling of variable-length fuzzy commands

These fixes enable TCP fuzzy protocol to work correctly with parallel
message processing and commands with extensions/shingles.

5 weeks ago[Minor] Reduce dumb log level
Vsevolod Stakhov [Wed, 22 Oct 2025 08:49:17 +0000 (09:49 +0100)] 
[Minor] Reduce dumb log level

5 weeks ago[Fix] Use pure ev_timer for TCP session timeouts instead of rspamd_io_ev
Vsevolod Stakhov [Wed, 22 Oct 2025 08:02:15 +0000 (09:02 +0100)] 
[Fix] Use pure ev_timer for TCP session timeouts instead of rspamd_io_ev

Replace rspamd_io_ev with pure ev_timer for TCP session timeouts.
rspamd_io_ev is a wrapper for combined IO+timer watchers and creates
unnecessary overhead when used for pure timers:

- Changed session->timer_ev from rspamd_io_ev to ev_timer
- Simplified callback signature to native libev callback
- Use ev_timer_init/ev_timer_start/ev_timer_stop directly
- Removed unnecessary wrapper functions and struct fields

This eliminates wasted memory from dummy ev_io structs and clarifies
the separation between IO watchers and timer-only watchers.

5 weeks ago[Fix] Add platform check for netinet/tcp.h include
Vsevolod Stakhov [Wed, 22 Oct 2025 07:49:50 +0000 (08:49 +0100)] 
[Fix] Add platform check for netinet/tcp.h include

Wrap netinet/tcp.h include in HAVE_NETINET_TCP_H check for better
portability across different platforms that may not have this header.

5 weeks ago[Fix] Prevent race conditions and fd reuse bugs in fuzzy TCP connections
Vsevolod Stakhov [Wed, 22 Oct 2025 07:31:48 +0000 (08:31 +0100)] 
[Fix] Prevent race conditions and fd reuse bugs in fuzzy TCP connections

Fix critical race conditions in TCP connection management for parallel message processing:

1. Add connection to pool BEFORE starting event watcher to prevent duplicate connections
   when multiple tasks try to connect simultaneously
2. Close fd and set to -1 immediately on connection failure to prevent fd reuse bugs
3. Create fuzzy_tcp_connection_close() helper to ensure consistent cleanup
4. Set conn->fd = -1 after close in connection_free to prevent double-close

These changes prevent crashes when processing thousands of messages in parallel where:
- Multiple tasks create duplicate connections to same upstream
- OS reuses fd numbers after close, causing wrong socket operations
- Event handlers access stale fd values after connection cleanup

5 weeks agoMerge pull request #5693 from rspamd/vstakhov-mempool-rewamp
Vsevolod Stakhov [Tue, 21 Oct 2025 13:17:21 +0000 (14:17 +0100)] 
Merge pull request #5693 from rspamd/vstakhov-mempool-rewamp

Improve memory pool destructors and allocation strategies

5 weeks ago[Fix] Prevent double-free in mempool destructor cleanup 5693/head
Vsevolod Stakhov [Tue, 21 Oct 2025 10:53:19 +0000 (11:53 +0100)] 
[Fix] Prevent double-free in mempool destructor cleanup

Mark heap as destroyed after rspamd_mempool_destructors_enforce to avoid
double destruction in subsequent rspamd_mempool_delete call