0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 8.1.0910: crash with tricky search pattern

Problem:    Crash with tricky search pattern. (Kuang-che Wu)
Solution:   Check for runnning out of memory. (closes #3950)
This commit is contained in:
Bram Moolenaar
2019-02-13 20:31:50 +01:00
parent d9ef1b8d77
commit 15bbd6ec87
3 changed files with 25 additions and 8 deletions

View File

@@ -4450,6 +4450,7 @@ skip_add:
if (l->n == l->len) if (l->n == l->len)
{ {
int newlen = l->len * 3 / 2 + 50; int newlen = l->len * 3 / 2 + 50;
nfa_thread_T *newt;
if (subs != &temp_subs) if (subs != &temp_subs)
{ {
@@ -4463,8 +4464,14 @@ skip_add:
subs = &temp_subs; subs = &temp_subs;
} }
/* TODO: check for vim_realloc() returning NULL. */ newt = vim_realloc(l->t, newlen * sizeof(nfa_thread_T));
l->t = vim_realloc(l->t, newlen * sizeof(nfa_thread_T)); if (newt == NULL)
{
// out of memory
--depth;
return NULL;
}
l->t = newt;
l->len = newlen; l->len = newlen;
} }
@@ -4756,7 +4763,7 @@ addstate_here(
* addstate(). */ * addstate(). */
r = addstate(l, state, subs, pim, -listidx - ADDSTATE_HERE_OFFSET); r = addstate(l, state, subs, pim, -listidx - ADDSTATE_HERE_OFFSET);
if (r == NULL) if (r == NULL)
return r; return NULL;
// when "*ip" was at the end of the list, nothing to do // when "*ip" was at the end of the list, nothing to do
if (listidx + 1 == tlen) if (listidx + 1 == tlen)
@@ -4777,12 +4784,13 @@ addstate_here(
{ {
/* not enough space to move the new states, reallocate the list /* not enough space to move the new states, reallocate the list
* and move the states to the right position */ * and move the states to the right position */
int newlen = l->len * 3 / 2 + 50;
nfa_thread_T *newl; nfa_thread_T *newl;
l->len = l->len * 3 / 2 + 50; newl = (nfa_thread_T *)alloc(newlen * sizeof(nfa_thread_T));
newl = (nfa_thread_T *)alloc(l->len * sizeof(nfa_thread_T));
if (newl == NULL) if (newl == NULL)
return r; return NULL;
l->len = newlen;
mch_memmove(&(newl[0]), mch_memmove(&(newl[0]),
&(l->t[0]), &(l->t[0]),
sizeof(nfa_thread_T) * listidx); sizeof(nfa_thread_T) * listidx);

View File

@@ -90,3 +90,10 @@ func Test_recursive_addstate()
let lnum = search('\v((){328}){389}') let lnum = search('\v((){328}){389}')
call assert_equal(0, lnum) call assert_equal(0, lnum)
endfunc endfunc
func Test_out_of_memory()
new
s/^/,n
" This will be slow...
call assert_fails('call search("\\v((n||<)+);")', 'E363:')
endfunc

View File

@@ -783,6 +783,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
910,
/**/ /**/
909, 909,
/**/ /**/