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;
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;
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;
}
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;
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)
{
#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;
*/
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
*/