]> git.ipfire.org Git - thirdparty/rspamd.git/log
thirdparty/rspamd.git
2 weeks agochore: add missing semicolon in whitelist.conf 5744/head
Dmitriy Alekseev [Thu, 13 Nov 2025 13:12:08 +0000 (14:12 +0100)] 
chore: add missing semicolon in whitelist.conf

2 weeks ago[Minor] Update version to 3.14.1
Vsevolod Stakhov [Thu, 13 Nov 2025 09:08:11 +0000 (09:08 +0000)] 
[Minor] Update version to 3.14.1

2 weeks agoMerge pull request #5741 from moisseev/webui
Vsevolod Stakhov [Wed, 12 Nov 2025 22:22:24 +0000 (22:22 +0000)] 
Merge pull request #5741 from moisseev/webui

[Minor] Fix hover behavior for Status tab tables

2 weeks ago[Minor] Improve droid code review workflow: use Sonnet, add explicit completion comme...
Vsevolod Stakhov [Wed, 12 Nov 2025 11:27:23 +0000 (11:27 +0000)] 
[Minor] Improve droid code review workflow: use Sonnet, add explicit completion comment, dismiss old change requests

2 weeks ago[Fix] Keep groups_*/symbols_* fields in settings for runtime processing
Vsevolod Stakhov [Wed, 12 Nov 2025 10:25:05 +0000 (10:25 +0000)] 
[Fix] Keep groups_*/symbols_* fields in settings for runtime processing

The Lua settings preprocessing was removing groups_disabled, groups_enabled,
symbols_disabled, and symbols_enabled fields from settings objects after
converting them to individual symbol lists. However, the C++ runtime code
(rspamd_symcache_process_settings) also needs these fields to mark symbols
as enabled/disabled in the runtime state.

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

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

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

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

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

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

2 weeks ago[Minor] Improve droid code review workflow to prevent repeated feedback and test...
Vsevolod Stakhov [Wed, 12 Nov 2025 08:59:26 +0000 (08:59 +0000)] 
[Minor] Improve droid code review workflow to prevent repeated feedback and test comments

2 weeks agoMerge pull request #5742 from moisseev/hover
Vsevolod Stakhov [Tue, 11 Nov 2025 20:55:41 +0000 (20:55 +0000)] 
Merge pull request #5742 from moisseev/hover

[Minor] WebUI: Restore hover colors for symbols

2 weeks ago[Minor] WebUI: Restore hover colors for symbols 5742/head
Alexander Moisseev [Tue, 11 Nov 2025 17:47:18 +0000 (20:47 +0300)] 
[Minor] WebUI: Restore hover colors for symbols

Fix regression introduced in #5725 where symbol hover states were
unified to a single color, losing the visual distinction between symbol types.

2 weeks ago[Minor] Restore symbol hover outside status tables 5741/head
Alexander Moisseev [Tue, 11 Nov 2025 14:54:46 +0000 (17:54 +0300)] 
[Minor] Restore symbol hover outside status tables

2 weeks ago[Minor] Fix hover behavior for Status tab tables
Alexander Moisseev [Tue, 11 Nov 2025 13:32:10 +0000 (16:32 +0300)] 
[Minor] Fix hover behavior for Status tab tables

Tables with rowspan cells (Bayesian statistics and Fuzzy hashes)
now have consistent hover highlighting across all rows in a group.

2 weeks agoRelease 3.14.0 3.14.0
Vsevolod Stakhov [Mon, 10 Nov 2025 15:54:44 +0000 (15:54 +0000)] 
Release 3.14.0

* [Feature] Fuzzy check: Add HTML fuzzy hashing for structural similarity matching
* [Feature] Fuzzy check: Add per-rule text_hashes toggle for HTML-only fuzzy rules
* [Feature] Fuzzy check: Add structured checks configuration with backward compatibility
* [Feature] Fuzzy storage: Implement full TCP protocol support with auto-switch
* [Feature] Fuzzy check: Add TCP connection management and error handling
* [Feature] URL: Add task:get_cta_urls() API for proper CTA domain extraction
* [Feature] URL: Move CTA processing into dedicated module
* [Feature] URL: Add url:get_hash() method for efficient deduplication without string conversion
* [Feature] GPT: Add web search context support with Redis caching
* [Feature] HTML: Add infrastructure for async URL rewriting with Lua bindings
* [Feature] HTML: Add task:rewrite_html_urls() and task:get_html_urls() Lua API
* [Feature] WebUI: Implement dark mode with theme toggle and auto detection
* [Feature] Aliases: Add advanced resolution with loop detection for converging paths
* [Feature] Milter: Add ESMTP argument parsing with Lua API access
* [Feature] Milter: Add per-recipient ESMTP args parsing and metadata access
* [Feature] Milter: Support array of positions for remove_headers operations
* [Feature] Proxy: Add client IP preservation in message headers through chain
* [Feature] Rspamc: Add milter.add_headers object format support to --mime
* [Feature] Configwizard: Add Postfix integration wizard using postconf utility
* [Feature] Build: Add comprehensive BSD workflows (FreeBSD, NetBSD, OpenBSD) with Lua version selection
* [Feature] Build: Add automated code review GitHub Actions workflow with Rspamd-specific guidelines
* [Feature] Build: Add Docker-based integration test suite with ASAN and real corpus
* [Feature] Build: Add automatic public suffix list synchronization
* [Feature] Multimap: Add support for symbols with leading numerals
* [Feature] DMARC: Add Auto-Reply-To and Precedence headers to prevent out-of-office replies
* [Feature] Platform: Add NetBSD memory usage tracking support
* [Feature] Utilities: Add fuzzy Redis migration utility
* [Feature] Bayes: Allow skipping local/authenticated mail in autolearn condition
* [Feature] ARC: Add DKIM signing key API for flexible ARC signing
* [Feature] Logger: Add type specifiers support for better formatting
* [Feature] Heap: Add rspamd_heap_push_slot to eliminate double allocation
* [Fix] DNS: Preserve req->pos during reply validation to prevent packet truncation on UDP-to-TCP retransmits
* [Fix] DNS: Regenerate transaction ID before copying to TCP buffer to avoid collisions
* [Fix] DNS: Fix nameserver round-robin when using /etc/resolv.conf
* [Fix] DNS: Fix TCP uninitialized memory leak
* [Fix] DMARC: Add batching and forced GC for Redis connections to prevent pool exhaustion
* [Fix] DMARC: Validate and normalize batch_size to prevent fractional indexing and loop errors
* [Fix] DMARC: Refactor reporting to use helper functions and async maps
* [Fix] Allocator: Fix jemalloc/system malloc mixing in getline() to prevent crashes
* [Fix] Allocator: Fix allocator mismatches in hiredis
* [Fix] Allocator: Fix allocator mismatches in libucl
* [Fix] Hyperscan: Use runtime version instead of compile-time for database validation
* [Fix] Hyperscan: Auto-recreate invalid unserialized cache files on version mismatch
* [Fix] Memory: Fix leaks in fuzzy storage khash tables
* [Fix] Memory: Fix leaks in upstream address parsing
* [Fix] Memory: Fix leaks in *-any address parsing
* [Fix] Memory: Fix OpenSSL providers cleanup
* [Fix] Memory: Fix UCL object memory leak in Lua integration
* [Fix] Memory: Fix stat metadata tokenization leak
* [Fix] Fuzzy TCP: Fix double-release in fuzzy_tcp_session
* [Fix] Fuzzy TCP: Fix refcount leak in destructor
* [Fix] Fuzzy TCP: Fix timeout handling and buffer overflow
* [Fix] Fuzzy TCP: Fix endianness mismatch in framing protocol
* [Fix] Fuzzy TCP: Fix race conditions and fd reuse bugs
* [Fix] Fuzzy TCP: Use pure ev_timer for session timeouts
* [Fix] Fuzzy TCP: Fix server replies and client event handling
* [Fix] Shutdown: Keep srv events active during shutdown to track auxiliary processes
* [Fix] ARC: Restore strict header ordering to comply with RFC 8617
* [Fix] ARC: Add ed25519 key support
* [Fix] Composites: Implement two-phase evaluation for postfilter dependencies
* [Fix] Composites: Use null-terminated string for symbol lookup
* [Fix] URL: Refactor extraction to prevent DoS with hash-based deduplication
* [Fix] URL: Add 50k URL limit with warning for DoS protection
* [Fix] URL: Skip HTML_DISPLAYED URLs in CTA detection
* [Fix] URL: Fix CTA priority preservation in extract_specific_urls
* [Fix] Bayes: Improve Redis server discovery
* [Fix] Bayes: Only bypass learn when header value matches
* [Fix] ESMTP: Robust per-recipient parsing in milter with safe cursor advance
* [Fix] ESMTP: Refcount ESMTP args in proxy_session_refresh to avoid use-after-free
* [Fix] ESMTP: Correct Lua stack cleanup in lua_task_get_rcpt_esmtp_args
* [Fix] HTML: Correct attribute value offset calculation for URL rewriting
* [Fix] HTML: Add HTML entity encoding for URL rewriting
* [Fix] HTML: Fix segfault due to incorrect HTML features access
* [Fix] HTML: Fix frequency-based ordering in domain hashing
* [Fix] HTML: Fix shingles hash generation bugs
* [Fix] HTML: Fix memory leaks in shingles generation
* [Fix] HTML: Fix memory management in html_cta.process_html_links
* [Fix] HTML: Fix CSS class normalization in fuzzy tokens
* [Fix] HTML: Fix cache key collision between text and HTML fuzzy hashes
* [Fix] OpenBSD: Fix kinfo_proc structure member names
* [Fix] OpenBSD: Disable Hyperscan (not available)
* [Fix] FreeBSD: Fix zstd package name
* [Fix] FreeBSD: Add IGNORE_OSVERSION for package version mismatches
* [Fix] NetBSD: Setup pkgin and PKG_PATH before installing packages
* [Fix] NetBSD: Fix missing dependencies and package names
* [Fix] BSD: Remove -j flag from ninja in all BSD workflows
* [Fix] Multimap: Handle symbols with leading numerals
* [Fix] Aliases: Prevent creation of malformed email addresses
* [Fix] Aliases: Fix alias loop detection for converging paths
* [Fix] Aliases: Fix is_local_domain to support backend objects
* [Fix] Aliases: Correct to_local when no recipients present
* [Fix] Aliases: Fix set_addr validation to prevent malformed addresses
* [Fix] MIME: Remove Authentication-Results and anonymize envelope-from in Received headers
* [Fix] Mempool: Prevent double-free in destructor cleanup
* [Fix] Rspamadm: Unbreak dnstool command
* [Fix] Integration tests: Fix ASAN configuration and startup diagnostics
* [Minor] Replace GHashTable with khash in fuzzy_check.c and lua_textpart_get_cta_urls
* [Minor] Update cache key prefix to match module name in llm_search_context
* [Minor] Fix llm_search_context to follow Rspamd idioms
* [Minor] Refactor llm_search_context to use lua_cache module
* [Minor] Address review comments in various modules
* [Minor] Fix droid usage
* [Minor] Use GPT-5 Codex for code reviews
* [Minor] Update libucl with automatic stack management
* [Rework] Prioritize CTA URLs in redirector and Lua helpers
* [Rework] RBL configuration: Add new from selectors, content_urls checks, and lower_utf8 for hashed domains
* [Rework] Make Bayes learn guards configurable
* [Rework] Refactor element visibility control to use Bootstrap classes
* [Rework] Use postconf utility for Postfix configuration in configwizard
* [Rework] Remove Lua-level HTTP header parsing in ESMTP args getters
* [Rework] Add CFG_REF_* macros with debug logging for config refcounting
* [Rework] Move OpenSSL providers from global to libs_ctx
* [Rework] Convert heap to fully intrusive kvec-based implementation
* [Rework] Add specialized pool types for long-lived and short-lived allocations
* [Rework] Improve memory pool destructors with smart preallocation based on pool type
* [Project] Restrict code review workflow to authorized maintainers
* [Project] Add Claude Code and Cursor AI assistant configuration
* [WebUI] Replace Glyphicons with FontAwesome SVG icons
* [WebUI] Update CodeJar to version 4.3.0
* [WebUI] Update Node.js and ESLint
* [WebUI] Update D3-based visualization libs
* [WebUI] Replace deprecated alert-error class with alert-danger
* [WebUI] Add search syntax hint to history table filter input
* [WebUI] Fix theme toggle default to auto
* [WebUI] Keep classifiers list when request is skipped
* [WebUI] Repopulate classifier dropdown
* [WebUI] Add comment for removeEventListener
* [WebUI] Fix icon rendering race condition in tab initialization
* [Test] Add comprehensive Lua unit tests for HTML URL rewriting
* [Test] Add unit tests for HTML URL rewriting patch engine
* [Test] Add functional tests for HTML fuzzy hashing
* [Test] Add ARC chain verification tests with multiple signatures
* [Test] Add e2e for classifier dropdown population
* [Test] Multimap symbol with leading numerals
* [Test] Sync public suffix list automatically
* [Test] Update JS linters
* [Test] Fix integration test environment variable passing
* [Test] Add detailed error output for integration test failures

2 weeks agoMerge pull request #5740 from rspamd/vstakhov-custom-actions-validation
Vsevolod Stakhov [Mon, 10 Nov 2025 15:04:39 +0000 (15:04 +0000)] 
Merge pull request #5740 from rspamd/vstakhov-custom-actions-validation

[Fix] Allow custom actions with flags in config validation

2 weeks agoMerge pull request #5733 from dragoangel/patch-14
Vsevolod Stakhov [Mon, 10 Nov 2025 14:46:31 +0000 (14:46 +0000)] 
Merge pull request #5733 from dragoangel/patch-14

[Feature] Update RBL configuration with new from selectors, and small refactor

2 weeks agoMerge pull request #5738 from moisseev/test
Vsevolod Stakhov [Mon, 10 Nov 2025 14:46:17 +0000 (14:46 +0000)] 
Merge pull request #5738 from moisseev/test

[Test] Update Node.js and ESLint

2 weeks agoMerge pull request #5739 from rspamd/vstakhov-rdns-fix-truncation
Vsevolod Stakhov [Mon, 10 Nov 2025 14:39:03 +0000 (14:39 +0000)] 
Merge pull request #5739 from rspamd/vstakhov-rdns-fix-truncation

[Fix] Preserve req->pos during reply validation to prevent packet truncation

2 weeks ago[Fix] Allow custom actions with flags in config validation 5740/head
Vsevolod Stakhov [Mon, 10 Nov 2025 13:58:25 +0000 (13:58 +0000)] 
[Fix] Allow custom actions with flags in config validation

The config validation was warning about unknown actions even when they
were valid custom actions defined with flags like 'no_threshold'.

Custom actions (e.g., malware, virus, hard-reject) are properly supported
by the C code but the Lua validation didn't recognize them, causing
spurious warnings.

Fix by checking if an unknown action is defined as an object with flags
before emitting the warning.

2 weeks ago[Minor] Set proper version
Vsevolod Stakhov [Mon, 10 Nov 2025 11:19:52 +0000 (11:19 +0000)] 
[Minor] Set proper version

2 weeks ago[Fix] Regenerate DNS transaction ID before copying packet to TCP buffer 5739/head
Vsevolod Stakhov [Mon, 10 Nov 2025 09:26:25 +0000 (09:26 +0000)] 
[Fix] Regenerate DNS transaction ID before copying packet to TCP buffer

When switching from UDP to TCP (e.g., on truncated response), the code
was copying the packet to the TCP output buffer before regenerating the
transaction ID to avoid collisions. This resulted in both UDP and TCP
packets having the same transaction ID.

Fix by moving the ID regeneration and IO channel switch logic before the
memcpy to the TCP output buffer, ensuring the TCP packet contains the
updated transaction ID.

2 weeks ago[Fix] Preserve req->pos during reply validation to prevent packet truncation on retra...
Vsevolod Stakhov [Mon, 10 Nov 2025 09:21:36 +0000 (09:21 +0000)] 
[Fix] Preserve req->pos during reply validation to prevent packet truncation on retransmit

The rdns_request_reply_cmp function modifies req->pos as a side effect
during reply validation. This caused packet truncation on retransmits
because req->pos (which tracks the full packet length) was overwritten
with the end position of the question section.

On timeout/retry, rdns_send_request would use the corrupted req->pos
value, resulting in truncated packets missing the OPT additional section.
This made resolvers like Knot and PowerDNS unable to parse retransmitted
packets.

Fix by saving and restoring req->pos around the reply comparison logic.

2 weeks ago[Minor] Replace GHashTable with khash in lua_textpart_get_cta_urls
Vsevolod Stakhov [Sun, 9 Nov 2025 15:27:45 +0000 (15:27 +0000)] 
[Minor] Replace GHashTable with khash in lua_textpart_get_cta_urls

Replace GHashTable with embedded khash for tracking seen URLs in
lua_textpart_get_cta_urls. khash provides better performance for
simple pointer sets and is already embedded in the project, reducing
external dependencies on GLib for this functionality.

3 weeks agoMerge pull request #5737 from rspamd/vstakhov-dmarc-report-batch
Vsevolod Stakhov [Sun, 9 Nov 2025 09:43:21 +0000 (09:43 +0000)] 
Merge pull request #5737 from rspamd/vstakhov-dmarc-report-batch

[Fix] Add batching and forced GC for Redis connections in dmarc_report

3 weeks ago[Test] Update Node.js and ESLint 5738/head
Alexander Moisseev [Sun, 9 Nov 2025 07:28:46 +0000 (10:28 +0300)] 
[Test] Update Node.js and ESLint

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 agoMerge branch 'master' into patch-14 5733/head
Dmitriy Alekseev [Sat, 8 Nov 2025 14:58:02 +0000 (15:58 +0100)] 
Merge branch 'master' into patch-14

3 weeks ago[Minor] Fix droid usage
Vsevolod Stakhov [Sat, 8 Nov 2025 14:23:10 +0000 (14:23 +0000)] 
[Minor] Fix droid usage

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 agoAdd 'content_urls' check to multiple RBL configurations
Dmitriy Alekseev [Thu, 6 Nov 2025 16:15:11 +0000 (17:15 +0100)] 
Add 'content_urls' check to multiple RBL configurations

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 agoFix whitespace in mailspike configuration
Dmitriy Alekseev [Thu, 6 Nov 2025 10:32:51 +0000 (11:32 +0100)] 
Fix whitespace in mailspike configuration

3 weeks agoRefactor checks array syntax in rbl.conf
Dmitriy Alekseev [Thu, 6 Nov 2025 10:31:49 +0000 (11:31 +0100)] 
Refactor checks array syntax in rbl.conf

3 weeks agoUpdate RBL config to use lower_utf8 for domains when hashing is in place
Dmitriy Alekseev [Thu, 6 Nov 2025 10:22:25 +0000 (11:22 +0100)] 
Update RBL config to use lower_utf8 for domains when hashing is in place

3 weeks agoRefactor RBL configuration entries
Dmitriy Alekseev [Thu, 6 Nov 2025 10:12:03 +0000 (11:12 +0100)] 
Refactor RBL configuration entries

Refactor RBL configuration for clarity and consistency.

3 weeks agoUpdate RBL configuration with new selectors
Dmitriy Alekseev [Wed, 5 Nov 2025 20:15:44 +0000 (21:15 +0100)] 
Update RBL configuration with new selectors

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.