changeset 5058:a00cd1839ac4 v7.3.1272

updated for version 7.3.1272 Problem: Crash when editing Ruby file. (Aliaksandr Rahalevich) Solution: Reallocate the state list when necessary.
author Bram Moolenaar <bram@vim.org>
date Sun, 30 Jun 2013 13:17:24 +0200
parents e5f776a5fa12
children 5dda3745e997
files src/regexp_nfa.c src/version.c
diffstat 2 files changed, 35 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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,