Browse Source

[CritFix] Protect regexp matcher from regexps with empty patterns

Issue: #4885
Closes: #4885
pull/4887/head
Vsevolod Stakhov 1 month ago
parent
commit
2038f3c92a
No account linked to committer's email address
3 changed files with 15 additions and 1 deletions
  1. 5
    0
      src/libserver/re_cache.c
  2. 4
    0
      src/libutil/multipattern.c
  3. 6
    1
      src/lua/lua_regexp.c

+ 5
- 0
src/libserver/re_cache.c View File

@@ -632,6 +632,11 @@ rspamd_re_cache_process_pcre(struct rspamd_re_runtime *rt,
if (max_hits > 0 && r >= max_hits) {
break;
}

if (start >= end) {
/* We found all matches, so no more hits are possible (protect from empty patterns) */
break;
}
}

rt->results[id] += r;

+ 4
- 0
src/libutil/multipattern.c View File

@@ -717,6 +717,10 @@ int rspamd_multipattern_lookup(struct rspamd_multipattern *mp,
&end,
TRUE,
NULL)) {
if (start >= end) {
/* We found all matches, so no more hits are possible (protect from empty patterns) */
break;
}
if (rspamd_multipattern_acism_cb(i, end - in, &cbd)) {
goto out;
}

+ 6
- 1
src/lua/lua_regexp.c View File

@@ -543,6 +543,11 @@ lua_regexp_search(lua_State *L)
}

matched = TRUE;

if (start >= end) {
/* We found all matches, so no more hits are possible (protect from empty patterns) */
break;
}
}

if (!matched) {
@@ -749,7 +754,7 @@ lua_regexp_split(lua_State *L)
lua_rawseti(L, -2, ++i);
matched = TRUE;
}
else if (start == end) {
else if (start >= end) {
break;
}
old_start = end;

Loading…
Cancel
Save