]> granicus.if.org Git - vim/commitdiff
patch 7.4.2347 v7.4.2347
authorBram Moolenaar <Bram@vim.org>
Thu, 8 Sep 2016 21:35:30 +0000 (23:35 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 8 Sep 2016 21:35:30 +0000 (23:35 +0200)
Problem:    Crash when closing a buffer while Visual mode is active.
            (Dominique Pelle)
Solution:   Adjust the position before computing the number of lines.
            When closing the current buffer stop Visual mode.

src/buffer.c
src/normal.c
src/testdir/test_normal.vim
src/version.c

index 398fee7b6f3d28829caecfb1c523eac876e110d8..3bfd9752206b5fe2d23801edf5ffa222d92b1193 100644 (file)
@@ -578,6 +578,11 @@ aucmd_abort:
     if (buf->b_ffname == NULL)
        del_buf = TRUE;
 
+    /* When closing the current buffer stop Visual mode before freeing
+     * anything. */
+    if (buf == curbuf)
+       end_visual_mode();
+
     /*
      * Free all things allocated for this buffer.
      * Also calls the "BufDelete" autocommands when del_buf is TRUE.
@@ -1379,6 +1384,10 @@ do_buffer(
            }
        }
 
+       /* When closing the current buffer stop Visual mode. */
+       if (buf == curbuf)
+           end_visual_mode();
+
        /*
         * If deleting the last (listed) buffer, make it empty.
         * The last (listed) buffer cannot be unloaded.
index edaa740e4cfcd06ed3acd128c61046071f9669d6..92ef575d25e5ab1944856f66c837e2d52a002028 100644 (file)
@@ -1609,6 +1609,8 @@ do_pending_operator(cmdarg_T *cap, int old_col, int gui_yank)
            oap->start = curwin->w_cursor;
        }
 
+       /* Just in case lines were deleted that make the position invalid. */
+       check_pos(curwin->w_buffer, &oap->end);
        oap->line_count = oap->end.lnum - oap->start.lnum + 1;
 
 #ifdef FEAT_VIRTUALEDIT
@@ -9451,10 +9453,7 @@ get_op_vcol(
 #ifdef FEAT_MBYTE
     /* prevent from moving onto a trail byte */
     if (has_mbyte)
-    {
-       check_pos(curwin->w_buffer, &oap->end);
        mb_adjustpos(curwin->w_buffer, &oap->end);
-    }
 #endif
 
     getvvcol(curwin, &(oap->start), &oap->start_vcol, NULL, &oap->end_vcol);
index b894a633c451ea888fa6390b95ec6f96091a057b..79af7b25877e12ac1f71addf9ab683bbab63f0a2 100644 (file)
@@ -1998,3 +1998,17 @@ func! Test_normal46_ignore()
   " clean up
   bw!
 endfu
+
+func! Test_normal47_visual_buf_wipe()
+  " This was causing a crash or ml_get error.
+  enew!
+  call setline(1,'xxx')
+  normal $
+  new
+  call setline(1, range(1,2))
+  2
+  exe "norm \<C-V>$"
+  bw!
+  norm yp
+  set nomodified
+endfu
index 55f8541098878234e71f6bd3b88434e9982d0c74..8740a985e212e7274cc521eabca315b932e80bac 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2347,
 /**/
     2346,
 /**/