changeset 10154:4647267906cc v7.4.2347

commit https://github.com/vim/vim/commit/c4a908e83690844b0d3a46124ba6af7d23485d69 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Sep 8 23:35:30 2016 +0200 patch 7.4.2347 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.
author Christian Brabandt <cb@256bit.org>
date Thu, 08 Sep 2016 23:45:06 +0200
parents 715d6c5707b8
children 68d73ceaa9bc
files src/buffer.c src/normal.c src/testdir/test_normal.vim src/version.c
diffstat 4 files changed, 27 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -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.
--- a/src/normal.c
+++ b/src/normal.c
@@ -1609,6 +1609,8 @@ do_pending_operator(cmdarg_T *cap, int o
 	    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);
--- a/src/testdir/test_normal.vim
+++ b/src/testdir/test_normal.vim
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2347,
+/**/
     2346,
 /**/
     2345,