case 'u':
case 'O':
case 'r':
+ case 'L':
+ /* Handled by rspamd_regexp_t */
g_string_append_c (re_flags, *p);
p++;
break;
goto err;
}
else {
+ const ucl_object_t *re_conditions = ucl_object_lookup (real_ud->conf_obj,
+ "re_conditions");
+ gint lua_cbref = -1;
+
/* Check regexp condition */
if (real_ud->conf_obj == NULL) {
g_set_error (err, rspamd_mime_expr_quark(), 300,
goto err;
}
- const ucl_object_t *re_conditions = ucl_object_lookup (real_ud->conf_obj,
- "re_conditions");
- gint lua_cbref = -1;
-
if (re_conditions != NULL) {
if (ucl_object_type (re_conditions) != UCL_OBJECT) {
g_set_error (err, rspamd_mime_expr_quark(), 320,
}
}
+ if (lua_cbref != -1) {
+ msg_info_config ("added condition for regexp %s", mime_atom->str);
+ }
+
/* Register new item in the cache */
if (mime_atom->d.re->type == RSPAMD_RE_HEADER ||
mime_atom->d.re->type == RSPAMD_RE_RAWHEADER ||
hs_flags[i] |= HS_FLAG_SINGLEMATCH;
}
+ if (re_flags & RSPAMD_REGEXP_FLAG_LEFTMOST) {
+ hs_flags[i] |= HS_FLAG_SOM_LEFTMOST;
+ }
+
gchar *pat = rspamd_re_cache_hs_pattern_from_pcre (re);
if (hs_compile (pat,
/* We optimize all regexps by default */
rspamd_flags |= RSPAMD_REGEXP_FLAG_NOOPT;
break;
+ case 'L':
+ /* SOM_LEFTMOST hyperscan flag */
+ rspamd_flags |= RSPAMD_REGEXP_FLAG_LEFTMOST;
+ break;
case 'r':
rspamd_flags |= RSPAMD_REGEXP_FLAG_RAW;
rspamd_flags &= ~RSPAMD_REGEXP_FLAG_UTF;
#define RSPAMD_REGEXP_FLAG_PCRE_ONLY (1 << 4)
#define RSPAMD_REGEXP_FLAG_DISABLE_JIT (1 << 5)
#define RSPAMD_REGEXP_FLAG_UTF (1 << 6)
+#define RSPAMD_REGEXP_FLAG_LEFTMOST (1 << 7)
#ifdef __cplusplus