]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Fix multipattern cache file cleanup and ACISM fallback
authorVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 5 Jan 2026 10:10:08 +0000 (10:10 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 5 Jan 2026 10:10:08 +0000 (10:10 +0000)
- Register multipattern cache files with rspamd_hyperscan_notice_known()
  to prevent hs_helper from cleaning them up during cache cleanup
- Fix ACISM pattern ID offset for mixed multipatterns (static + TLD):
  when ACISM callback returns strnum, add acism_id_offset to get the
  actual pattern ID that the URL scanner expects

src/libutil/multipattern.c

index 52bb0742f93bbfee603b73a7adf84dffa075d424..23628013f740f823f24b006c10eb55ca5bbb3b4d 100644 (file)
@@ -54,6 +54,7 @@ struct RSPAMD_ALIGNED(64) rspamd_multipattern {
        ac_trie_t *t;
        GArray *pats;
        GArray *res;
+       unsigned int acism_id_offset; /* ID offset for ACISM patterns (for mixed multipatterns) */
 
        gboolean compiled;
        unsigned int cnt;
@@ -366,6 +367,8 @@ void rspamd_multipattern_add_pattern_len(struct rspamd_multipattern *mp,
                        /* Create pats array on demand for ACISM fallback */
                        if (mp->pats == NULL) {
                                mp->pats = g_array_new(FALSE, TRUE, sizeof(ac_trie_pat_t));
+                               /* Record ID offset: first TLD pattern gets current cnt as its ID */
+                               mp->acism_id_offset = mp->cnt;
                        }
 
                        acism_pat.ptr = rspamd_multipattern_escape_tld_acism(pattern, patlen, &dlen);
@@ -444,6 +447,9 @@ rspamd_multipattern_try_load_hs(struct rspamd_multipattern *mp,
                return FALSE;
        }
 
+       /* Register the file so it won't be cleaned up */
+       rspamd_hyperscan_notice_known(fp);
+
        return TRUE;
 }
 
@@ -776,9 +782,12 @@ rspamd_multipattern_acism_cb(int strnum, int textpos, void *context)
        struct rspamd_multipattern_cbdata *cbd = context;
        int ret;
        ac_trie_pat_t pat;
+       unsigned int actual_id;
 
        pat = g_array_index(cbd->mp->pats, ac_trie_pat_t, strnum);
-       ret = cbd->cb(cbd->mp, strnum, textpos - pat.len,
+       /* Adjust pattern ID by offset for mixed multipatterns */
+       actual_id = strnum + cbd->mp->acism_id_offset;
+       ret = cbd->cb(cbd->mp, actual_id, textpos - pat.len,
                                  textpos, cbd->in, cbd->len, cbd->ud);
 
        cbd->nfound++;