summaryrefslogtreecommitdiff
path: root/src/regexp_nfa.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-02-13 21:47:36 +0100
committerBram Moolenaar <Bram@vim.org>2019-02-13 21:47:36 +0100
commit688b3983d8b321e0d32dd51914fa474a0988daf6 (patch)
tree6a505c3a795f22a9ef84a01dd1cb4f4c444bed60 /src/regexp_nfa.c
parent18442cbcc0d335a8ea6947e94eee9a2ab9552690 (diff)
downloadvim-git-688b3983d8b321e0d32dd51914fa474a0988daf6.tar.gz
patch 8.1.0913: CI crashes when running out of memoryv8.1.0913
Problem: CI crashes when running out of memory. Solution: Apply 'maxmempattern' also to new regexp engine.
Diffstat (limited to 'src/regexp_nfa.c')
-rw-r--r--src/regexp_nfa.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index 2a16fff94..dadb9d067 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -4445,13 +4445,20 @@ skip_add:
goto skip_add;
}
- /* When there are backreferences or PIMs the number of states may
- * be (a lot) bigger than anticipated. */
+ // When there are backreferences or PIMs the number of states may
+ // be (a lot) bigger than anticipated.
if (l->n == l->len)
{
int newlen = l->len * 3 / 2 + 50;
+ size_t newsize = newlen * sizeof(nfa_thread_T);
nfa_thread_T *newt;
+ if ((long)(newsize >> 10) >= p_mmp)
+ {
+ emsg(_(e_maxmempat));
+ --depth;
+ return NULL;
+ }
if (subs != &temp_subs)
{
/* "subs" may point into the current array, need to make a
@@ -4464,7 +4471,7 @@ skip_add:
subs = &temp_subs;
}
- newt = vim_realloc(l->t, newlen * sizeof(nfa_thread_T));
+ newt = vim_realloc(l->t, newsize);
if (newt == NULL)
{
// out of memory
@@ -4785,9 +4792,15 @@ addstate_here(
/* not enough space to move the new states, reallocate the list
* and move the states to the right position */
int newlen = l->len * 3 / 2 + 50;
+ size_t newsize = newlen * sizeof(nfa_thread_T);
nfa_thread_T *newl;
- newl = (nfa_thread_T *)alloc(newlen * sizeof(nfa_thread_T));
+ if ((long)(newsize >> 10) >= p_mmp)
+ {
+ emsg(_(e_maxmempat));
+ return NULL;
+ }
+ newl = (nfa_thread_T *)alloc(newsize);
if (newl == NULL)
return NULL;
l->len = newlen;