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:
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user