]> granicus.if.org Git - vim/commitdiff
patch 8.1.0913: CI crashes when running out of memory v8.1.0913
authorBram Moolenaar <Bram@vim.org>
Wed, 13 Feb 2019 20:47:36 +0000 (21:47 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 13 Feb 2019 20:47:36 +0000 (21:47 +0100)
Problem:    CI crashes when running out of memory.
Solution:   Apply 'maxmempattern' also to new regexp engine.

src/regexp_nfa.c
src/version.c

index 2a16fff94a2d60aac905c6d1f8fb5ba43e058817..dadb9d067fb2be9b543b4b9ee63d7e32f6102680 100644 (file)
@@ -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;
index 343270cc04ab88ebc8ae9e0d16ade566b60fa1fc..f60b9d62bee562dd6d306154086405e7c905f4ea 100644 (file)
@@ -783,6 +783,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    913,
 /**/
     912,
 /**/