]> granicus.if.org Git - vim/commitdiff
patch 8.2.1553: crash in edit test v8.2.1553
authorBram Moolenaar <Bram@vim.org>
Mon, 31 Aug 2020 19:15:02 +0000 (21:15 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 31 Aug 2020 19:15:02 +0000 (21:15 +0200)
Problem:    Crash in edit test.
Solution:   Avoid using invalid pointer.

src/fold.c
src/version.c

index e4ae9cbc0b363924747f0680c83da38275c1432b..90fafea6366251e29be514fdf2284e390e7847ad 100644 (file)
@@ -608,35 +608,41 @@ foldCreate(linenr_T start, linenr_T end)
 
     // Find the place to insert the new fold.
     gap = &curwin->w_folds;
-    for (;;)
+    if (gap->ga_len == 0)
+       i = 0;
+    else
     {
-       if (!foldFind(gap, start_rel, &fp))
-           break;
-       if (fp->fd_top + fp->fd_len > end_rel)
+       for (;;)
        {
-           // New fold is completely inside this fold: Go one level deeper.
-           gap = &fp->fd_nested;
-           start_rel -= fp->fd_top;
-           end_rel -= fp->fd_top;
-           if (use_level || fp->fd_flags == FD_LEVEL)
+           if (!foldFind(gap, start_rel, &fp))
+               break;
+           if (fp->fd_top + fp->fd_len > end_rel)
            {
-               use_level = TRUE;
-               if (level >= curwin->w_p_fdl)
+               // New fold is completely inside this fold: Go one level
+               // deeper.
+               gap = &fp->fd_nested;
+               start_rel -= fp->fd_top;
+               end_rel -= fp->fd_top;
+               if (use_level || fp->fd_flags == FD_LEVEL)
+               {
+                   use_level = TRUE;
+                   if (level >= curwin->w_p_fdl)
+                       closed = TRUE;
+               }
+               else if (fp->fd_flags == FD_CLOSED)
                    closed = TRUE;
+               ++level;
+           }
+           else
+           {
+               // This fold and new fold overlap: Insert here and move some
+               // folds inside the new fold.
+               break;
            }
-           else if (fp->fd_flags == FD_CLOSED)
-               closed = TRUE;
-           ++level;
-       }
-       else
-       {
-           // This fold and new fold overlap: Insert here and move some folds
-           // inside the new fold.
-           break;
        }
+       i = (int)(fp - (fold_T *)gap->ga_data);
     }
 
-    i = (int)(fp - (fold_T *)gap->ga_data);
     if (ga_grow(gap, 1) == OK)
     {
        fp = (fold_T *)gap->ga_data + i;
index b709939f6aa49f19584b4806db352202c67134cc..8155ffccb9886b02d98e0ee3a6cf49109aed7111 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1553,
 /**/
     1552,
 /**/