]> granicus.if.org Git - vim/commitdiff
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode.... v7.4.690
authorBram Moolenaar <Bram@vim.org>
Fri, 3 Apr 2015 15:11:45 +0000 (17:11 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 3 Apr 2015 15:11:45 +0000 (17:11 +0200)
            redraw when using CTRL-U. (Knil Ino)
Solution:   Update pointers after calling ga_grow().

src/ex_getln.c
src/version.c

index 31e61d0945ac76c4505bc8d50e5cd8df569ce401..cd9dffdeaf59c35d907f99483eb870e2f9c0452f 100644 (file)
@@ -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;
                }
index bc2714b4517db8e2cab5385d9f1327c2d1d52ac5..a847921c07b8bf4ce72350ce5bbe943bb38796f0 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    690,
 /**/
     689,
 /**/