summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-09-08 23:35:30 +0200
committerBram Moolenaar <Bram@vim.org>2016-09-08 23:35:30 +0200
commitc4a908e83690844b0d3a46124ba6af7d23485d69 (patch)
tree1a38f95d4fb857bd49b70a60e9de225c19b4574a
parentabd468ed0fbcba391e7833feeaa7de3ced841455 (diff)
patch 7.4.2347v7.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.
-rw-r--r--src/buffer.c9
-rw-r--r--src/normal.c5
-rw-r--r--src/testdir/test_normal.vim14
-rw-r--r--src/version.c2
4 files changed, 27 insertions, 3 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 398fee7b6f..3bfd975220 100644
--- 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.
diff --git a/src/normal.c b/src/normal.c
index edaa740e4c..92ef575d25 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -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);
diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim
index b894a633c4..79af7b2587 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 55f8541098..8740a985e2 100644
--- 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,