summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <bram@vim.org>2013-06-30 13:17:24 +0200
committerBram Moolenaar <bram@vim.org>2013-06-30 13:17:24 +0200
commit51a8c4461ea3c891d6459fb14c28d53d4da9805e (patch)
tree49568b495852d63c4338497e724f52ded62fd0dd
parent5d610fd8bfef48a321c55b7eb30d5188102972a1 (diff)
downloadvim-51a8c4461ea3c891d6459fb14c28d53d4da9805e.tar.gz
updated for version 7.3.1272v7.3.1272v7-3-1272
Problem: Crash when editing Ruby file. (Aliaksandr Rahalevich) Solution: Reallocate the state list when necessary.
-rw-r--r--src/regexp_nfa.c41
-rw-r--r--src/version.c2
2 files changed, 35 insertions, 8 deletions
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index bd3818d7..5f000f6a 100644
--- 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
index 3a0b3673..24903236 100644
--- 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,