aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil/regexp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil/regexp.c')
-rw-r--r--src/libutil/regexp.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/libutil/regexp.c b/src/libutil/regexp.c
index 3f93051f6..a50148740 100644
--- a/src/libutil/regexp.c
+++ b/src/libutil/regexp.c
@@ -35,6 +35,7 @@ typedef guchar regexp_id_t[BLAKE2B_OUTBYTES];
#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;
@@ -133,11 +134,13 @@ rspamd_regexp_new (const gchar *pattern, const gchar *flags,
else if (*start == 'm') {
start ++;
sep = *start;
+ rspamd_flags |= RSPAMD_REGEXP_FLAG_FULL_MATCH;
}
if (sep == '\0' || g_ascii_isalnum (sep)) {
/* We have no flags, no separators and just use all line as expr */
start = pattern;
end = start + strlen (pattern);
+ rspamd_flags &= ~RSPAMD_REGEXP_FLAG_FULL_MATCH;
}
else {
end = strrchr (pattern, sep);
@@ -159,7 +162,7 @@ rspamd_regexp_new (const gchar *pattern, const gchar *flags,
end = pattern + strlen (pattern);
}
- regexp_flags |= PCRE_UTF8 | PCRE_NO_AUTO_CAPTURE;
+ regexp_flags |= PCRE_UTF8 ;
if (flags != NULL) {
flags_str = flags;
@@ -366,6 +369,13 @@ rspamd_regexp_search (rspamd_regexp_t *re, const gchar *text, gsize len,
*end = mt + ovec[0] + ovec[1];
}
+ if (re->flags & RSPAMD_REGEXP_FLAG_FULL_MATCH) {
+ /* We also ensure that the match is full */
+ if (ovec[0] != 0 || (guint)ovec[1] < len) {
+ return FALSE;
+ }
+ }
+
return TRUE;
}