From 576108c64c01901848010673efc53b46a24dbc92 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 10 Dec 2015 15:38:34 +0000 Subject: [PATCH] Add special flag to disable hyperscan for particular expressions --- src/libserver/re_cache.c | 11 ++++++++++- src/libutil/regexp.c | 16 ++++++++++++---- src/libutil/regexp.h | 9 +++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c index cf9caa7f0..8d728b02e 100644 --- a/src/libserver/re_cache.c +++ b/src/libserver/re_cache.c @@ -992,7 +992,7 @@ rspamd_re_cache_compile_hyperscan (struct rspamd_re_cache *cache, struct rspamd_re_class *re_class; gchar path[PATH_MAX]; hs_database_t *test_db; - gint fd, i, n, *hs_ids = NULL, pcre_flags; + gint fd, i, n, *hs_ids = NULL, pcre_flags, re_flags; guint64 crc; rspamd_regexp_t *re; hs_compile_error_t *hs_errors; @@ -1045,6 +1045,12 @@ rspamd_re_cache_compile_hyperscan (struct rspamd_re_cache *cache, hs_flags[i] = 0; pcre_flags = rspamd_regexp_get_pcre_flags (re); + re_flags = rspamd_regexp_get_flags (re); + + if (re_flags & RSPAMD_REGEXP_FLAG_PCRE_ONLY) { + /* Do not try to compile bad regexp */ + continue; + } if (pcre_flags & PCRE_UTF8) { hs_flags[i] |= HS_FLAG_UTF8; @@ -1055,6 +1061,9 @@ rspamd_re_cache_compile_hyperscan (struct rspamd_re_cache *cache, if (pcre_flags & PCRE_MULTILINE) { hs_flags[i] |= HS_FLAG_MULTILINE; } + if (pcre_flags & PCRE_DOTALL) { + hs_flags[i] |= HS_FLAG_DOTALL; + } if (rspamd_regexp_get_maxhits (re) == 1) { hs_flags[i] |= HS_FLAG_SINGLEMATCH; } diff --git a/src/libutil/regexp.c b/src/libutil/regexp.c index 39ff5ebf2..5b3fca551 100644 --- a/src/libutil/regexp.c +++ b/src/libutil/regexp.c @@ -33,10 +33,6 @@ typedef guchar regexp_id_t[rspamd_cryptobox_HASHBYTES]; -#define RSPAMD_REGEXP_FLAG_RAW (1 << 1) -#define RSPAMD_REGEXP_FLAG_NOOPT (1 << 2) -#define RSPAMD_REGEXP_FLAG_FULL_MATCH (1 << 3) - struct rspamd_regexp_s { gdouble exec_time; gchar *pattern; @@ -493,6 +489,18 @@ rspamd_regexp_get_pattern (rspamd_regexp_t *re) return re->pattern; } +guint +rspamd_regexp_set_flags (rspamd_regexp_t *re, guint new_flags) +{ + guint old_flags; + + g_assert (re != NULL); + old_flags = re->flags; + re->flags = new_flags; + + return old_flags; +} + guint rspamd_regexp_get_flags (rspamd_regexp_t *re) { diff --git a/src/libutil/regexp.h b/src/libutil/regexp.h index 0b585ceec..bf88035e2 100644 --- a/src/libutil/regexp.h +++ b/src/libutil/regexp.h @@ -28,6 +28,10 @@ #include "config.h" #define RSPAMD_INVALID_ID ((guint64)-1LL) +#define RSPAMD_REGEXP_FLAG_RAW (1 << 1) +#define RSPAMD_REGEXP_FLAG_NOOPT (1 << 2) +#define RSPAMD_REGEXP_FLAG_FULL_MATCH (1 << 3) +#define RSPAMD_REGEXP_FLAG_PCRE_ONLY (1 << 4) typedef struct rspamd_regexp_s rspamd_regexp_t; struct rspamd_regexp_cache; @@ -121,6 +125,11 @@ guint rspamd_regexp_get_pcre_flags (rspamd_regexp_t *re); */ guint rspamd_regexp_get_flags (rspamd_regexp_t *re); +/** + * Set rspamd flags for the regexp + */ +guint rspamd_regexp_set_flags (rspamd_regexp_t *re, guint new_flags); + /** * Set regexp maximum hits */ -- 2.39.5