]> source.dussan.org Git - rspamd.git/commitdiff
Add special flag to disable hyperscan for particular expressions
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 10 Dec 2015 15:38:34 +0000 (15:38 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 10 Dec 2015 15:38:34 +0000 (15:38 +0000)
src/libserver/re_cache.c
src/libutil/regexp.c
src/libutil/regexp.h

index cf9caa7f078f0276e4585c408db1b4bcdbb2e9ed..8d728b02e87b6afa49e6855f31a6a00834425b88 100644 (file)
@@ -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;
                        }
index 39ff5ebf2f83403e4d3827c43c898078b8737dff..5b3fca5519a2ddaad53c8b320206e43a8e8f8418 100644 (file)
 
 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)
 {
index 0b585ceec5464f1c2d49566c8d0d6c776b8544a7..bf88035e2d4589937acbe5aabf7ec14f44fde3e9 100644 (file)
 #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
  */