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.
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)
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;