# HG changeset patch # User Bram Moolenaar # Date 1372591044 -7200 # Node ID a00cd1839ac4f3467e1e51e619b4c65ce4e0ee81 # Parent e5f776a5fa123afd0f04c053f77a6a5a0d57aec3 updated for version 7.3.1272 Problem: Crash when editing Ruby file. (Aliaksandr Rahalevich) Solution: Reallocate the state list when necessary. diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -4228,14 +4228,39 @@ addstate_here(l, state, subs, pim, ip) } else if (count > 1) { - /* make space for new states, then move them from the - * end to the current position */ - mch_memmove(&(l->t[listidx + count]), - &(l->t[listidx + 1]), - sizeof(nfa_thread_T) * (l->n - listidx - 1)); - mch_memmove(&(l->t[listidx]), - &(l->t[l->n - 1]), - sizeof(nfa_thread_T) * count); + if (l->n + count - 1 >= l->len) + { + /* not enough space to move the new states, reallocate the list + * and move the states to the right position */ + nfa_thread_T *newl; + + l->len = l->len * 3 / 2 + 50; + newl = (nfa_thread_T *)alloc(l->len * sizeof(nfa_thread_T)); + if (newl == NULL) + return; + mch_memmove(&(newl[0]), + &(l->t[0]), + sizeof(nfa_thread_T) * listidx); + mch_memmove(&(newl[listidx]), + &(l->t[l->n - count]), + sizeof(nfa_thread_T) * count); + mch_memmove(&(newl[listidx + count]), + &(l->t[listidx + 1]), + sizeof(nfa_thread_T) * (l->n - count - listidx - 1)); + vim_free(l->t); + l->t = newl; + } + else + { + /* make space for new states, then move them from the + * end to the current position */ + mch_memmove(&(l->t[listidx + count]), + &(l->t[listidx + 1]), + sizeof(nfa_thread_T) * (l->n - listidx - 1)); + mch_memmove(&(l->t[listidx]), + &(l->t[l->n - 1]), + sizeof(nfa_thread_T) * count); + } } --l->n; *ip = listidx - 1; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1272, +/**/ 1271, /**/ 1270,