aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libserver/re_cache.c11
-rw-r--r--src/libutil/regexp.c16
-rw-r--r--src/libutil/regexp.h9
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;
@@ -494,6 +490,18 @@ rspamd_regexp_get_pattern (rspamd_regexp_t *re)
}
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)
{
g_assert (re != NULL);
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;
@@ -122,6 +126,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
*/
guint rspamd_regexp_get_maxhits (rspamd_regexp_t *re);