@@ -898,7 +898,7 @@ rspamd_language_detector_init(struct rspamd_config *cfg) | |||
rspamd_language_detector_process_chain(cfg, chain); | |||
}); | |||
if (!rspamd_multipattern_compile(ret->stop_words[i].mp, &err)) { | |||
if (!rspamd_multipattern_compile(ret->stop_words[i].mp, 0, &err)) { | |||
msg_err_config("cannot compile stop words for %z language group: %e", | |||
i, err); | |||
g_error_free(err); |
@@ -674,7 +674,7 @@ rspamd_check_gtube(struct rspamd_task *task, struct rspamd_mime_text_part *part) | |||
RSPAMD_MULTIPATTERN_DEFAULT); | |||
GError *err = NULL; | |||
rspamd_multipattern_compile(gtube_matcher, &err); | |||
rspamd_multipattern_compile(gtube_matcher, RSPAMD_MULTIPATTERN_COMPILE_NO_FS, &err); | |||
if (err != NULL) { | |||
/* It will be expensive, but I don't care, still better than to abort */ |
@@ -1,11 +1,11 @@ | |||
/*- | |||
* Copyright 2016 Vsevolod Stakhov | |||
/* | |||
* Copyright 2024 Vsevolod Stakhov | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
@@ -169,7 +169,7 @@ rspamd_mime_parser_init_lib(void) | |||
rspamd_multipattern_add_pattern(lib_ctx->mp_boundary, "\n--", 0); | |||
GError *err = NULL; | |||
if (!rspamd_multipattern_compile(lib_ctx->mp_boundary, &err)) { | |||
if (!rspamd_multipattern_compile(lib_ctx->mp_boundary, RSPAMD_MULTIPATTERN_COMPILE_NO_FS, &err)) { | |||
msg_err("fatal error: cannot compile multipattern for mime parser boundaries: %e", err); | |||
g_error_free(err); | |||
g_abort(); |
@@ -1,5 +1,5 @@ | |||
/* | |||
* Copyright 2023 Vsevolod Stakhov | |||
* Copyright 2024 Vsevolod Stakhov | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
@@ -539,6 +539,7 @@ void rspamd_url_init(const gchar *tld_file) | |||
{ | |||
GError *err = NULL; | |||
gboolean ret = TRUE; | |||
int mp_compile_flags = 0; | |||
if (url_scanner != NULL) { | |||
rspamd_url_deinit(); | |||
@@ -564,6 +565,7 @@ void rspamd_url_init(const gchar *tld_file) | |||
url_scanner->matchers_full = NULL; | |||
url_scanner->search_trie_full = NULL; | |||
url_scanner->has_tld_file = false; | |||
mp_compile_flags |= RSPAMD_MULTIPATTERN_COMPILE_NO_FS; | |||
} | |||
rspamd_url_add_static_matchers(url_scanner); | |||
@@ -577,13 +579,13 @@ void rspamd_url_init(const gchar *tld_file) | |||
url_scanner->matchers_full->len); | |||
} | |||
if (!rspamd_multipattern_compile(url_scanner->search_trie_strict, &err)) { | |||
if (!rspamd_multipattern_compile(url_scanner->search_trie_strict, mp_compile_flags, &err)) { | |||
msg_err("cannot compile url matcher static patterns, fatal error: %e", err); | |||
abort(); | |||
} | |||
if (url_scanner->search_trie_full) { | |||
if (!rspamd_multipattern_compile(url_scanner->search_trie_full, &err)) { | |||
if (!rspamd_multipattern_compile(url_scanner->search_trie_full, mp_compile_flags, &err)) { | |||
msg_err("cannot compile tld patterns, url matching will be " | |||
"incomplete: %e", | |||
err); |
@@ -1,11 +1,11 @@ | |||
/*- | |||
* Copyright 2016 Vsevolod Stakhov | |||
/* | |||
* Copyright 2024 Vsevolod Stakhov | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
@@ -466,7 +466,7 @@ rspamd_multipattern_try_save_hs(struct rspamd_multipattern *mp, | |||
#endif | |||
gboolean | |||
rspamd_multipattern_compile(struct rspamd_multipattern *mp, GError **err) | |||
rspamd_multipattern_compile(struct rspamd_multipattern *mp, int flags, GError **err) | |||
{ | |||
g_assert(mp != NULL); | |||
g_assert(!mp->compiled); | |||
@@ -483,7 +483,7 @@ rspamd_multipattern_compile(struct rspamd_multipattern *mp, GError **err) | |||
rspamd_cryptobox_hash_update(&mp->hash_state, (void *) &plt, sizeof(plt)); | |||
rspamd_cryptobox_hash_final(&mp->hash_state, hash); | |||
if (!rspamd_multipattern_try_load_hs(mp, hash)) { | |||
if ((flags & RSPAMD_MULTIPATTERN_COMPILE_NO_FS) || !rspamd_multipattern_try_load_hs(mp, hash)) { | |||
hs_database_t *db = NULL; | |||
if (hs_compile_multi((const char *const *) mp->hs_pats->data, | |||
@@ -504,18 +504,23 @@ rspamd_multipattern_compile(struct rspamd_multipattern *mp, GError **err) | |||
return FALSE; | |||
} | |||
if (hs_cache_dir != NULL) { | |||
char fpath[PATH_MAX]; | |||
rspamd_snprintf(fpath, sizeof(fpath), "%s/%*xs.hsmp", hs_cache_dir, | |||
(gint) rspamd_cryptobox_HASHBYTES / 2, hash); | |||
mp->hs_db = rspamd_hyperscan_from_raw_db(db, fpath); | |||
if (!(flags & RSPAMD_MULTIPATTERN_COMPILE_NO_FS)) { | |||
if (hs_cache_dir != NULL) { | |||
char fpath[PATH_MAX]; | |||
rspamd_snprintf(fpath, sizeof(fpath), "%s/%*xs.hsmp", hs_cache_dir, | |||
(gint) rspamd_cryptobox_HASHBYTES / 2, hash); | |||
mp->hs_db = rspamd_hyperscan_from_raw_db(db, fpath); | |||
} | |||
else { | |||
/* Should not happen in the real life */ | |||
mp->hs_db = rspamd_hyperscan_from_raw_db(db, NULL); | |||
} | |||
rspamd_multipattern_try_save_hs(mp, hash); | |||
} | |||
else { | |||
/* Should not happen in the real life */ | |||
mp->hs_db = rspamd_hyperscan_from_raw_db(db, NULL); | |||
} | |||
rspamd_multipattern_try_save_hs(mp, hash); | |||
} | |||
for (i = 0; i < MAX_SCRATCH; i++) { |
@@ -1,11 +1,11 @@ | |||
/*- | |||
* Copyright 2016 Vsevolod Stakhov | |||
/* | |||
* Copyright 2024 Vsevolod Stakhov | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
@@ -117,12 +117,15 @@ void rspamd_multipattern_add_pattern(struct rspamd_multipattern *mp, | |||
void rspamd_multipattern_add_pattern_len(struct rspamd_multipattern *mp, | |||
const gchar *pattern, gsize patlen, gint flags); | |||
#define RSPAMD_MULTIPATTERN_COMPILE_NO_FS (0x1u << 0u) | |||
/** | |||
* Compiles multipattern structure | |||
* @param mp | |||
* @return | |||
*/ | |||
gboolean rspamd_multipattern_compile(struct rspamd_multipattern *mp, | |||
int flags, | |||
GError **err); | |||
/** |
@@ -1,11 +1,11 @@ | |||
/*- | |||
* Copyright 2016 Vsevolod Stakhov | |||
/* | |||
* Copyright 2024 Vsevolod Stakhov | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
@@ -142,7 +142,7 @@ lua_trie_create(lua_State *L) | |||
lua_pop(L, 1); /* table */ | |||
if (!rspamd_multipattern_compile(trie, &err)) { | |||
if (!rspamd_multipattern_compile(trie, 0, &err)) { | |||
msg_err("cannot compile multipattern: %e", err); | |||
g_error_free(err); | |||
rspamd_multipattern_destroy(trie); |