summaryrefslogtreecommitdiffstats
path: root/src/libutil
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/regexp.c25
-rw-r--r--src/libutil/regexp.h10
2 files changed, 35 insertions, 0 deletions
diff --git a/src/libutil/regexp.c b/src/libutil/regexp.c
index 584c0c5c9..46ed9a0df 100644
--- a/src/libutil/regexp.c
+++ b/src/libutil/regexp.c
@@ -66,6 +66,7 @@ struct rspamd_regexp_s {
gpointer ud;
gpointer re_class;
guint64 cache_id;
+ gsize match_limit;
guint max_hits;
gint flags;
gint pcre_flags;
@@ -567,6 +568,10 @@ rspamd_regexp_search (const rspamd_regexp_t *re, const gchar *text, gsize len,
len = strlen (text);
}
+ if (re->match_limit > 0 && len > re->match_limit) {
+ len = re->match_limit;
+ }
+
if (end != NULL && *end != NULL) {
/* Incremental search */
mt = (*end);
@@ -889,6 +894,26 @@ rspamd_regexp_set_cache_id (rspamd_regexp_t *re, guint64 id)
return old;
}
+gsize
+rspamd_regexp_get_match_limit (const rspamd_regexp_t *re)
+{
+ g_assert (re != NULL);
+
+ return re->match_limit;
+}
+
+gsize
+rspamd_regexp_set_match_limit (rspamd_regexp_t *re, gsize lim)
+{
+ gsize old;
+
+ g_assert (re != NULL);
+ old = re->match_limit;
+ re->match_limit = lim;
+
+ return old;
+}
+
gboolean
rspamd_regexp_match (const rspamd_regexp_t *re, const gchar *text, gsize len,
gboolean raw)
diff --git a/src/libutil/regexp.h b/src/libutil/regexp.h
index 1e98b7b3c..3437619d1 100644
--- a/src/libutil/regexp.h
+++ b/src/libutil/regexp.h
@@ -182,6 +182,16 @@ guint64 rspamd_regexp_get_cache_id (const rspamd_regexp_t *re);
guint64 rspamd_regexp_set_cache_id (rspamd_regexp_t *re, guint64 id);
/**
+ * Returns match limit for a regexp
+ */
+gsize rspamd_regexp_get_match_limit (const rspamd_regexp_t *re);
+
+/**
+ * Sets cache id for a regexp
+ */
+gsize rspamd_regexp_set_match_limit (rspamd_regexp_t *re, gsize lim);
+
+/**
* Get regexp class for the re object
*/
gpointer rspamd_regexp_get_class (const rspamd_regexp_t *re);