]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Stat: fix memory leak in metadata tokenization
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 18 Oct 2025 14:19:27 +0000 (15:19 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 18 Oct 2025 14:19:27 +0000 (15:19 +0100)
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.

src/libstat/stat_process.c

index ffd0fa11af4a1479b260a2f216e3448f9851b7f1..9e14d09c439b25502707e3b233c5daf98b5c2469 100644 (file)
@@ -104,6 +104,13 @@ rspamd_task_get_autolearn_class(struct rspamd_task *task)
        return NULL;
 }
 
+static void
+rspamd_words_kvec_dtor(gpointer p)
+{
+       rspamd_words_t *words = (rspamd_words_t *) p;
+       kv_destroy(*words);
+}
+
 static void
 rspamd_stat_tokenize_parts_metadata(struct rspamd_stat_ctx *st_ctx,
                                                                        struct rspamd_task *task)
@@ -115,6 +122,7 @@ rspamd_stat_tokenize_parts_metadata(struct rspamd_stat_ctx *st_ctx,
 
        words = rspamd_mempool_alloc(task->task_pool, sizeof(*words));
        kv_init(*words);
+       rspamd_mempool_add_destructor(task->task_pool, rspamd_words_kvec_dtor, words);
        memset(&elt, 0, sizeof(elt));
        elt.flags = RSPAMD_STAT_TOKEN_FLAG_META;