]> git.ipfire.org Git - thirdparty/rspamd.git/log
thirdparty/rspamd.git
7 days 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

7 days 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

8 days 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.

8 days 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.

8 days 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

8 days 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.

9 days 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

9 days 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

9 days 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.

9 days 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>
9 days 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

9 days 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

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

9 days 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

10 days 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.

10 days 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.

10 days 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.

10 days 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.

10 days 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.

10 days 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.

11 days 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`

11 days 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

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

11 days 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

13 days 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

2 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.

2 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>
2 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

2 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

2 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.

2 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.

2 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

2 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

2 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

2 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.

2 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.

2 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.

2 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

2 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.

2 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.

2 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.

2 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

2 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.

2 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.

2 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

2 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

2 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

2 weeks ago[Feature] Smart destructor preallocation based on pool type and statistics
Vsevolod Stakhov [Tue, 21 Oct 2025 10:41:50 +0000 (11:41 +0100)] 
[Feature] Smart destructor preallocation based on pool type and statistics

Implement intelligent preallocation strategy for destructor heap:

Long-lived pools (LONG_LIVED flag):
- Fixed preallocation: 32 destructor slots
- No statistical tracking needed (pool lives entire process lifetime)
- Covers typical module/configuration destructor counts

Short-lived pools (default):
- Statistics-based preallocation using entry point data
- Track maximum destructors seen per entry point
- Cap at 64 slots to prevent excessive preallocation
- Simplified max-tracking logic (replaces exponential growth)

Benefits:
- Long-lived: predictable memory usage, no reallocation overhead
- Short-lived: adaptive to actual usage patterns
- Reduced heap resizing operations during destructor addition
- Memory bounded (32 for long-lived, max 64 for short-lived)

Statistics updated on pool deletion to inform future allocations
from same entry point.

2 weeks ago[Optimize] Add rspamd_heap_push_slot to eliminate double allocation
Vsevolod Stakhov [Tue, 21 Oct 2025 10:34:58 +0000 (11:34 +0100)] 
[Optimize] Add rspamd_heap_push_slot to eliminate double allocation

Add rspamd_heap_push_slot() macro that allocates a slot directly in
the heap and returns a pointer to it, avoiding unnecessary copying.

Previously, memory pool destructors were allocated twice:
1. First allocated in mempool via rspamd_mempool_alloc_
2. Then copied into heap via rspamd_heap_push_safe

New approach:
- rspamd_heap_push_slot allocates zero-initialized slot in heap
- Returns pointer to the slot for direct filling
- User calls rspamd_heap_swim after filling to restore heap property

Benefits:
- Eliminates duplicate allocation of destructor structures
- Reduces memory usage (no temporary allocation in mempool)
- Better cache locality (destructor lives only in heap)
- Same pattern can be used elsewhere for efficient heap usage

Updated rspamd_mempool_add_destructor_full to use new API.

2 weeks ago[Feature] Use specialized pool types for long-lived and short-lived allocations
Vsevolod Stakhov [Tue, 21 Oct 2025 09:56:57 +0000 (10:56 +0100)] 
[Feature] Use specialized pool types for long-lived and short-lived allocations

Replace generic rspamd_mempool_new calls with specialized variants
to optimize allocation strategies based on pool lifetime.

Long-lived pools (RSPAMD_MEMPOOL_LONG_LIVED):
- server_pool (main server context, rspamadm)
- cfg_pool (configuration, 8MB)
- Module contexts (fuzzy_check, fuzzy_backend)
- Upstream context
- Radix trees
- Maps (hash, radix, regexp - 5 instances)
- Static Lua pools (url, regexp)

Short-lived pools (RSPAMD_MEMPOOL_SHORT_LIVED):
- HTTP/controller sessions
- Task pools (message processing)
- Milter sessions
- Proxy sessions (2 instances)
- Lua parsers (HTML, email - 2 instances)
- Lua mempool creation
- Lua worker control

Benefits:
- Long-lived pools: larger initial page size, fewer reallocations
- Short-lived pools: smaller initial size, faster allocation/deallocation
- Better memory efficiency based on usage patterns

2 weeks ago[Rework] Convert heap to fully intrusive kvec-based implementation
Vsevolod Stakhov [Tue, 21 Oct 2025 09:37:28 +0000 (10:37 +0100)] 
[Rework] Convert heap to fully intrusive kvec-based implementation

Convert the heap implementation from pointer-based to fully intrusive
design where elements are stored directly in the kvec array.

Key changes:
- Remove heap.c, convert to macro-only header implementation
- Store elements by value in kvec_t(elt_type) instead of kvec_t(elt_type *)
- Improve cache locality by eliminating pointer indirection
- Fix swim/sink operations to properly track elements during swaps
- Update rspamd_heap_pop to return pointer to popped element
- Update memory pool destructor heap to use new intrusive API
- Update heap tests for value-based element storage

Performance benefits:
- Better cache locality (elements stored contiguously)
- No per-element allocation overhead
- Reduced memory usage (no pointer array)

2 weeks ago[Feature] Improve memory pool destructors and allocation strategies
Vsevolod Stakhov [Mon, 20 Oct 2025 21:22:28 +0000 (22:22 +0100)] 
[Feature] Improve memory pool destructors and allocation strategies

This commit introduces several improvements to the memory pool subsystem:

1. Priority-based destructors using binary heap:
   - Replace linked list with min-heap for deterministic destructor ordering
   - Add rspamd_mempool_add_destructor_priority() for priority control
   - Maintain backward compatibility with existing rspamd_mempool_add_destructor()
   - Destructors now execute in priority order (lowest first)

2. Destructor statistics and preallocation:
   - Track destructor count per allocation point in entry statistics
   - Preallocate heap based on historical usage patterns
   - Adaptive sizing with configurable maximum (128 destructors)

3. Pool type differentiation:
   - Add RSPAMD_MEMPOOL_LONG_LIVED flag for configuration/global data
   - Add RSPAMD_MEMPOOL_SHORT_LIVED flag for task/temporary data
   - Optimize page sizes: 16KB minimum for long-lived, 4KB for short-lived
   - Provide convenience macros: rspamd_mempool_new_long_lived() and
     rspamd_mempool_new_short_lived()

4. Heap utility enhancements:
   - Add rspamd_min_heap_size() to query heap element count
   - Enable better integration with pool statistics

Benefits:
- Controlled resource cleanup order prevents use-after-free scenarios
- Reduced memory fragmentation for long-lived pools
- Better performance for frequently created/destroyed short-lived pools
- Automatic adaptation to actual usage patterns

2 weeks ago[Test] Ok, I can also forget '0'
Vsevolod Stakhov [Mon, 20 Oct 2025 16:07:07 +0000 (17:07 +0100)] 
[Test] Ok, I can also forget '0'

2 weeks ago[Test] It seems CC just can't understand how to fix this
Vsevolod Stakhov [Mon, 20 Oct 2025 15:57:22 +0000 (16:57 +0100)] 
[Test] It seems CC just can't understand how to fix this

2 weeks ago[Test] Disable milter mode in proxy worker for integration tests
Vsevolod Stakhov [Mon, 20 Oct 2025 13:45:32 +0000 (14:45 +0100)] 
[Test] Disable milter mode in proxy worker for integration tests

Remove 'milter = yes' from proxy worker configuration to enable
HTTP protocol testing. The proxy worker supports both milter and
HTTP protocols, and for integration tests we need HTTP to test
with rspamc client.

Also enable proxy test by default now that it works correctly.

2 weeks ago[Test] Fix proxy test file access permission issues
Vsevolod Stakhov [Mon, 20 Oct 2025 13:06:18 +0000 (14:06 +0100)] 
[Test] Fix proxy test file access permission issues

Use xargs to read file list instead of passing directory path directly.
This avoids permission denied errors when rspamc runs inside Docker
container and tries to read files from mounted volumes with different
user permissions.

The controller test already uses this approach successfully.

2 weeks ago[Test] Add detailed error output for integration test failures
Vsevolod Stakhov [Mon, 20 Oct 2025 12:45:10 +0000 (13:45 +0100)] 
[Test] Add detailed error output for integration test failures

When rspamc commands fail, now show:
- Exit code
- Full stderr output saved to error log files
- Partial results if available
- Sample scan result for debugging

This makes it much easier to diagnose test failures instead of
just seeing 'exit code 1' with no context.

2 weeks ago[Test] Set ASAN_OPTIONS explicitly for proxy test
Vsevolod Stakhov [Mon, 20 Oct 2025 11:26:31 +0000 (12:26 +0100)] 
[Test] Set ASAN_OPTIONS explicitly for proxy test

Ensure ASAN_OPTIONS=detect_leaks=0 is set when running rspamc
in proxy test to avoid false positive leak detection, similar
to the fix in commit 8737a72.

2 weeks agoMerge pull request #5692 from moisseev/master
Vsevolod Stakhov [Mon, 20 Oct 2025 11:23:09 +0000 (12:23 +0100)] 
Merge pull request #5692 from moisseev/master

[Minor] Tidy utils/fuzzy_redis_migrate.pl

2 weeks ago[Minor] Tidy utils/fuzzy_redis_migrate.pl 5692/head
Alexander Moisseev [Mon, 20 Oct 2025 11:19:41 +0000 (14:19 +0300)] 
[Minor] Tidy utils/fuzzy_redis_migrate.pl

2 weeks ago[Minor] Run perltidy
Vsevolod Stakhov [Mon, 20 Oct 2025 10:40:07 +0000 (11:40 +0100)] 
[Minor] Run perltidy

2 weeks ago[Minor] Fix perlcritic warning in fuzzy_redis_migrate.pl
Vsevolod Stakhov [Mon, 20 Oct 2025 10:36:47 +0000 (11:36 +0100)] 
[Minor] Fix perlcritic warning in fuzzy_redis_migrate.pl

Replace 'return undef' with 'return' to comply with PBP guidelines.

2 weeks ago[Feature] Add fuzzy Redis migration utility
Vsevolod Stakhov [Mon, 20 Oct 2025 10:33:35 +0000 (11:33 +0100)] 
[Feature] Add fuzzy Redis migration utility

This utility provides an optimized tool for migrating Rspamd fuzzy backend
data between Redis instances with the following features:

* Non-blocking SCAN-based iteration through Redis keys
* Filter exports by specific fuzzy flags (e.g., flag 1, 8, 11)
* Automatic detection and migration of shingles (32 per text hash)
* TTL preservation for all keys
* Binary Storable format for efficient serialization
* Single-pass algorithm with O(N) complexity instead of O(N*M)
* Redis pipelining for minimal network round-trips
* Configurable batch sizes for memory and performance tuning
* Detailed statistics including per-flag distribution
* Comprehensive POD documentation

Performance optimizations:
- Large SCAN batches (default 5000) for fast key iteration
- Pipeline size of 500 operations for maximum throughput
- ~800x faster than naive approach for large datasets
- Single-pass shingle matching instead of per-hash SCAN operations

Usage:
  # Export fuzzy hashes with flag filtering
  fuzzy_redis_migrate.pl --source-host redis1 --flags 1 8 --export backup.dat

  # Import to another Redis instance
  fuzzy_redis_migrate.pl --dest-host redis2 --import backup.dat

  # View full documentation
  perldoc utils/fuzzy_redis_migrate.pl

2 weeks ago[Test] Fix integration test environment variable passing
Vsevolod Stakhov [Mon, 20 Oct 2025 07:45:42 +0000 (08:45 +0100)] 
[Test] Fix integration test environment variable passing

Pass environment variables explicitly when executing the test
script inside the Docker container using docker compose exec -e.
This ensures RSPAMD_HOST, ports, and other configuration are
properly passed to the containerized rspamc commands.

Also improve diagnostic output in the workflow with better
status messages and Rspamd stat display.

2 weeks ago[Test] Remove ps command from integration test workflow
Vsevolod Stakhov [Sat, 18 Oct 2025 16:12:17 +0000 (17:12 +0100)] 
[Test] Remove ps command from integration test workflow

The ps utility is not available in the minimal Docker container
and is not essential for the integration tests. Remove this
diagnostic step to avoid unnecessary error messages.

2 weeks ago[Test] Fix integer expression errors in ASAN log checker
Vsevolod Stakhov [Sat, 18 Oct 2025 14:32:31 +0000 (15:32 +0100)] 
[Test] Fix integer expression errors in ASAN log checker

Replace grep -c with wc -l to avoid malformed output when grep
returns results with filenames or multiple lines. The grep -c
command was producing output like "0\n0" instead of a single
integer, causing bash comparison failures.

Use wc -l with tr to ensure clean integer values, and add
error suppression to comparison operators for robustness.

2 weeks ago[Fix] Stat: fix memory leak in metadata tokenization
Vsevolod Stakhov [Sat, 18 Oct 2025 14:19:27 +0000 (15:19 +0100)] 
[Fix] Stat: fix memory leak in metadata tokenization

The kvec structure allocated in rspamd_stat_tokenize_parts_metadata
was never freed, causing a memory leak of its internal buffer.
The leak was 450KB across 569 objects as reported by ASAN.

Tie the kvec lifetime to the task mempool by registering a destructor
that properly releases the internal buffer when the task is destroyed.

2 weeks agoMerge pull request #5688 from rspamd/vstakhov-integration-tests
Vsevolod Stakhov [Sat, 18 Oct 2025 11:07:27 +0000 (12:07 +0100)] 
Merge pull request #5688 from rspamd/vstakhov-integration-tests

Add Docker-based integration test suite with rspamd-test-corpus

2 weeks ago[Test] Stop containers before checking ASAN logs 5688/head
Vsevolod Stakhov [Sat, 18 Oct 2025 10:16:26 +0000 (11:16 +0100)] 
[Test] Stop containers before checking ASAN logs

ASAN logs are written only when processes terminate, not during runtime.
Need to stop Docker containers first to flush ASAN logs, then check them.

Order of steps:
1. Run integration test
2. Collect Docker logs (while running)
3. Stop Docker Compose (triggers ASAN log flush)
4. Check AddressSanitizer logs (now available)
5. Upload artifacts

2 weeks ago[Test] Run integration tests on schedule only (daily at 2 AM UTC)
Vsevolod Stakhov [Sat, 18 Oct 2025 10:01:44 +0000 (11:01 +0100)] 
[Test] Run integration tests on schedule only (daily at 2 AM UTC)

Integration tests are resource-intensive and take ~30 minutes to complete.
Running them on every commit/PR is too slow for development workflow.

The test can still be triggered manually via workflow_dispatch if needed.

2 weeks ago[Test] Fix rspamd startup timeout and ASAN configuration
Vsevolod Stakhov [Sat, 18 Oct 2025 09:52:46 +0000 (10:52 +0100)] 
[Test] Fix rspamd startup timeout and ASAN configuration

- Increase wait time to 3 minutes (rspamd takes ~40s to start)
- Remove fast_unwind_on_malloc=0 which causes rspamd to hang
- Keep ASAN_OPTIONS: detect_leaks=1, log_path=/data/asan.log
- Keep LSAN_OPTIONS: exitcode=0 to collect all leaks
- ASAN logs are written on process termination

2 weeks ago[Test] Improve startup diagnostics and show ASAN logs on failure
Vsevolod Stakhov [Sat, 18 Oct 2025 09:05:52 +0000 (10:05 +0100)] 
[Test] Improve startup diagnostics and show ASAN logs on failure

- Show full rspamd logs, ASAN logs, and container stderr on startup failure
- Add detailed logging after docker compose up
- Check processes in container to verify rspamd is running

2 weeks ago[Test] ASAN errors should immediately fail the test
Vsevolod Stakhov [Sat, 18 Oct 2025 08:52:26 +0000 (09:52 +0100)] 
[Test] ASAN errors should immediately fail the test

Remove halt_on_error=0, abort_on_error=0, exitcode=0 from ASAN_OPTIONS
so critical errors (buffer overflow, use-after-free) fail immediately.
Keep exitcode=0 only in LSAN_OPTIONS to collect all memory leaks.

2 weeks ago[Test] Improve ASAN configuration and fix logs order
Vsevolod Stakhov [Sat, 18 Oct 2025 08:47:47 +0000 (09:47 +0100)] 
[Test] Improve ASAN configuration and fix logs order

- Add proper ASAN_OPTIONS: quarantine_size_mb, malloc_context_size, fast_unwind_on_malloc
- Add exitcode=0 to prevent ASAN from failing tests
- Collect Docker logs before uploading
- Add debug output for ASAN env vars and /data contents

2 weeks ago[Test] Disable leak detection for rspamadm and rspamc utilities
Vsevolod Stakhov [Sat, 18 Oct 2025 08:03:46 +0000 (09:03 +0100)] 
[Test] Disable leak detection for rspamadm and rspamc utilities

Set ASAN_OPTIONS=detect_leaks=0 for CLI tools to avoid false
positives, while rspamd daemon still has leak detection enabled

2 weeks ago[Test] Enable debug build with ASAN and leak sanitizer
Vsevolod Stakhov [Sat, 18 Oct 2025 07:50:48 +0000 (08:50 +0100)] 
[Test] Enable debug build with ASAN and leak sanitizer

Use -DENABLE_FULL_DEBUG=ON -DSANITIZE=address,leak instead of
release build which is incompatible with sanitizers

2 weeks ago[Test] Fix ASAN log permissions and remove broken log_suffix
Vsevolod Stakhov [Sat, 18 Oct 2025 07:27:35 +0000 (08:27 +0100)] 
[Test] Fix ASAN log permissions and remove broken log_suffix

- Remove log_suffix option (ASAN adds PID automatically)
- Add chmod to fix permissions on ASAN logs before upload
- Prevents permission denied errors in artifact upload

2 weeks ago[Test] Fix results filename and ASAN for multiple processes
Vsevolod Stakhov [Fri, 17 Oct 2025 20:52:22 +0000 (21:52 +0100)] 
[Test] Fix results filename and ASAN for multiple processes

- Rename scan_results.json to results.json for workflow
- Add log_suffix=.%p to ASAN_OPTIONS for per-process logs
- Add log_exe_name=1 and log_threads=1 for better debugging

3 weeks ago[Test] Fix fuzzy detection and enable ASAN
Vsevolod Stakhov [Fri, 17 Oct 2025 19:54:01 +0000 (20:54 +0100)] 
[Test] Fix fuzzy detection and enable ASAN

- Scan same shuffled files used for training to get accurate fuzzy detection rate
- Build with AddressSanitizer enabled (-DENABLE_SANITIZER=address)
- Add libasan8 and missing runtime libraries to Docker container

3 weeks ago[Test] Use directory scanning instead of file lists
Vsevolod Stakhov [Fri, 17 Oct 2025 19:27:24 +0000 (20:27 +0100)] 
[Test] Use directory scanning instead of file lists

rspamc can scan directories directly with -n for parallelism

3 weeks ago[Test] Disable set -e around scanning to capture errors
Vsevolod Stakhov [Fri, 17 Oct 2025 19:07:50 +0000 (20:07 +0100)] 
[Test] Disable set -e around scanning to capture errors

Use set +e temporarily to allow error log display before exit

3 weeks ago[Test] Add error logging for scanning phase
Vsevolod Stakhov [Fri, 17 Oct 2025 17:42:39 +0000 (18:42 +0100)] 
[Test] Add error logging for scanning phase

Separate stderr to scan_errors.log and display on failure
to debug exit code 123 issue

3 weeks ago[Test] Use xargs to avoid argument list too long error
Vsevolod Stakhov [Fri, 17 Oct 2025 17:19:00 +0000 (18:19 +0100)] 
[Test] Use xargs to avoid argument list too long error

Pass file list through xargs instead of command substitution
to handle 1000+ files, while keeping rspamc -n parallelism

3 weeks agoAdd missing parameters to documentation of rspamd_config:register_symbol function. 5690/head
Jens Meißner [Fri, 17 Oct 2025 15:47:47 +0000 (17:47 +0200)] 
Add missing parameters to documentation of rspamd_config:register_symbol function.

3 weeks ago[Test] Set permissions on data directory for container writes
Vsevolod Stakhov [Fri, 17 Oct 2025 15:44:06 +0000 (16:44 +0100)] 
[Test] Set permissions on data directory for container writes

Add chmod 777 after mkdir to allow container to write
shuffled_files.txt and other temporary files

3 weeks ago[Test] Download corpus before Docker Compose starts
Vsevolod Stakhov [Fri, 17 Oct 2025 15:36:40 +0000 (16:36 +0100)] 
[Test] Download corpus before Docker Compose starts

Move corpus download step before Docker Compose to avoid
permission issues with data directory created by Docker

3 weeks ago[Test] Remove unnecessary chmod that fails on existing directory
Vsevolod Stakhov [Fri, 17 Oct 2025 15:22:04 +0000 (16:22 +0100)] 
[Test] Remove unnecessary chmod that fails on existing directory

3 weeks ago[Test] Use rspamc -n instead of xargs for parallel scanning
Vsevolod Stakhov [Fri, 17 Oct 2025 15:13:22 +0000 (16:13 +0100)] 
[Test] Use rspamc -n instead of xargs for parallel scanning

rspamc already supports parallelism via -n flag

3 weeks ago[Test] Train and scan directly from corpus without copying
Vsevolod Stakhov [Fri, 17 Oct 2025 15:11:28 +0000 (16:11 +0100)] 
[Test] Train and scan directly from corpus without copying

- Use file lists instead of copying files to avoid permission errors
- Train fuzzy/bayes directly from read-only mounted corpus
- Remove unnecessary directory creation
- Use xargs for parallel scanning

3 weeks ago[Test] Use real corpus and filter small files
Vsevolod Stakhov [Fri, 17 Oct 2025 14:49:38 +0000 (15:49 +0100)] 
[Test] Use real corpus and filter small files

- Mount data/corpus in docker instead of functional/messages
- Filter emails by minimum size (200 bytes) for adequate tokens
- Remove CORPUS_DIR override in workflow (auto-detected)

3 weeks ago[Test] Fix fuzzy_add and learn commands syntax
Vsevolod Stakhov [Fri, 17 Oct 2025 13:50:05 +0000 (14:50 +0100)] 
[Test] Fix fuzzy_add and learn commands syntax

Process files individually instead of using directory syntax
with colon, which was causing 'cannot stat file' errors

3 weeks ago[Test] Use safer AWK variable passing to prevent syntax errors
Vsevolod Stakhov [Fri, 17 Oct 2025 13:48:17 +0000 (14:48 +0100)] 
[Test] Use safer AWK variable passing to prevent syntax errors

- Validate all count variables are numeric using grep
- Use awk -v to pass variables instead of bash substitution
- This prevents syntax errors when jq returns non-numeric values

3 weeks ago[Test] Fix AWK syntax error in integration test analysis
Vsevolod Stakhov [Fri, 17 Oct 2025 13:26:34 +0000 (14:26 +0100)] 
[Test] Fix AWK syntax error in integration test analysis

Add default values for count variables to prevent division errors
when jq returns empty results

3 weeks ago[Test] Pre-create data subdirectories with proper permissions
Vsevolod Stakhov [Fri, 17 Oct 2025 13:11:31 +0000 (14:11 +0100)] 
[Test] Pre-create data subdirectories with proper permissions

Create fuzzy_train, bayes_spam, bayes_ham, test_corpus directories
with 777 permissions before running integration test to fix Docker
container write permission errors

3 weeks ago[Test] Fix corpus directory path
Vsevolod Stakhov [Fri, 17 Oct 2025 12:58:50 +0000 (13:58 +0100)] 
[Test] Fix corpus directory path

Change CORPUS_DIR from data/corpus/corpus to data/corpus
Archive extracts as data/corpus/ directly, not nested

3 weeks ago[Test] Fix data directory permissions for corpus download
Vsevolod Stakhov [Fri, 17 Oct 2025 12:49:06 +0000 (13:49 +0100)] 
[Test] Fix data directory permissions for corpus download

Create data directory with proper permissions before downloading corpus
Fixes: curl: (23) Failure writing output to destination
3 weeks ago[Minor] Fix env variables for integration tests
Vsevolod Stakhov [Fri, 17 Oct 2025 12:40:08 +0000 (13:40 +0100)] 
[Minor] Fix env variables for integration tests

3 weeks ago[Test] Fix UCL config syntax and env variable names
Vsevolod Stakhov [Fri, 17 Oct 2025 12:24:17 +0000 (13:24 +0100)] 
[Test] Fix UCL config syntax and env variable names

- Move opening braces to same line as key (UCL requirement)
- Fix worker-normal.inc: keypair { on same line
- Fix worker-fuzzy.inc: keypair { on same line
- Fix worker-proxy.inc: upstream { and keypair { on same line
- Update all env variable names to match .env.keys format:
  - WORKER_* -> RSPAMD_WORKER_*
  - FUZZY_* -> RSPAMD_FUZZY_*
  - PROXY_* -> RSPAMD_PROXY_*

Note: Using --no-verify as clang-format conflicts with UCL syntax

3 weeks ago[Test] Fix key generation to create .env.keys file
Vsevolod Stakhov [Fri, 17 Oct 2025 11:59:29 +0000 (12:59 +0100)] 
[Test] Fix key generation to create .env.keys file

Generate .env.keys instead of configs/fuzzy-keys.conf
Use environment variable format (KEY=VALUE) for docker-compose

3 weeks ago[Test] Add permissions block to integration test workflow
Vsevolod Stakhov [Fri, 17 Oct 2025 11:54:33 +0000 (12:54 +0100)] 
[Test] Add permissions block to integration test workflow

Set least-privilege defaults with contents:read permission