changeset 6733:5f6077b10738 v7.4.690

patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing redraw when using CTRL-U. (Knil Ino) Solution: Update pointers after calling ga_grow().
author Bram Moolenaar <bram@vim.org>
date Fri, 03 Apr 2015 17:11:45 +0200
parents 4ec5e61b31b3
children 043905c563a3
files src/ex_getln.c src/version.c
diffstat 2 files changed, 16 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -2245,6 +2245,9 @@ getexmodeline(promptc, cookie, indent)
     got_int = FALSE;
     while (!got_int)
     {
+	long    sw;
+	char_u *s;
+
 	if (ga_grow(&line_ga, 40) == FAIL)
 	    break;
 
@@ -2296,13 +2299,12 @@ getexmodeline(promptc, cookie, indent)
 		msg_col = startcol;
 		msg_clr_eos();
 		line_ga.ga_len = 0;
-		continue;
+		goto redraw;
 	    }
 
 	    if (c1 == Ctrl_T)
 	    {
-		long	    sw = get_sw_value(curbuf);
-
+		sw = get_sw_value(curbuf);
 		p = (char_u *)line_ga.ga_data;
 		p[line_ga.ga_len] = NUL;
 		indent = get_indent_str(p, 8, FALSE);
@@ -2310,9 +2312,9 @@ getexmodeline(promptc, cookie, indent)
 add_indent:
 		while (get_indent_str(p, 8, FALSE) < indent)
 		{
-		    char_u *s = skipwhite(p);
-
-		    ga_grow(&line_ga, 1);
+		    ga_grow(&line_ga, 2);  /* one more for the NUL */
+		    p = (char_u *)line_ga.ga_data;
+		    s = skipwhite(p);
 		    mch_memmove(s + 1, s, line_ga.ga_len - (s - p) + 1);
 		    *s = ' ';
 		    ++line_ga.ga_len;
@@ -2361,13 +2363,15 @@ redraw:
 		{
 		    p[line_ga.ga_len] = NUL;
 		    indent = get_indent_str(p, 8, FALSE);
-		    --indent;
-		    indent -= indent % get_sw_value(curbuf);
+		    if (indent > 0)
+		    {
+			--indent;
+			indent -= indent % get_sw_value(curbuf);
+		    }
 		}
 		while (get_indent_str(p, 8, FALSE) > indent)
 		{
-		    char_u *s = skipwhite(p);
-
+		    s = skipwhite(p);
 		    mch_memmove(s - 1, s, line_ga.ga_len - (s - p) + 1);
 		    --line_ga.ga_len;
 		}
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    690,
+/**/
     689,
 /**/
     688,