aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorraichoo <raichoo@googlemail.com>2017-03-11 10:46:50 +0100
committerraichoo <raichoo@googlemail.com>2017-03-19 21:14:11 +0100
commitae828982ceb9dc4c5bde58a276e6e10df6f35051 (patch)
tree7a5825075836640489dd37614f2f27b6c917cf30 /src
parent4500b16f15510f6091ca98b78aa4ee13e1acf2c7 (diff)
downloadrneovim-ae828982ceb9dc4c5bde58a276e6e10df6f35051.tar.gz
rneovim-ae828982ceb9dc4c5bde58a276e6e10df6f35051.tar.bz2
rneovim-ae828982ceb9dc4c5bde58a276e6e10df6f35051.zip
vim-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. https://github.com/vim/vim/commit/c4a908e83690844b0d3a46124ba6af7d23485d69
Diffstat (limited to 'src')
-rw-r--r--src/nvim/buffer.c12
-rw-r--r--src/nvim/normal.c3
-rw-r--r--src/nvim/testdir/test_normal.vim14
-rw-r--r--src/nvim/version.c2
4 files changed, 29 insertions, 2 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index f52989c74d..0a95cc9020 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -438,6 +438,13 @@ void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last)
/* Remember if we are closing the current buffer. Restore the number of
* windows, so that autocommands in buf_freeall() don't get confused. */
bool is_curbuf = (buf == curbuf);
+
+ // When closing the current buffer stop Visual mode before freeing
+ // anything.
+ if (is_curbuf) {
+ end_visual_mode();
+ }
+
buf->b_nwindows = nwindows;
buf_freeall(buf, (del_buf ? BFA_DEL : 0) + (wipe_buf ? BFA_WIPE : 0));
@@ -1075,6 +1082,11 @@ 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/nvim/normal.c b/src/nvim/normal.c
index 1fd03257ec..ce286042df 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -1596,6 +1596,8 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool 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;
/* Set "virtual_op" before resetting VIsual_active. */
@@ -7831,7 +7833,6 @@ static void get_op_vcol(
// prevent from moving onto a trail byte
if (has_mbyte) {
- check_pos(curwin->w_buffer, &oap->end);
mb_adjustpos(curwin->w_buffer, &oap->end);
}
diff --git a/src/nvim/testdir/test_normal.vim b/src/nvim/testdir/test_normal.vim
index b894a633c4..79af7b2587 100644
--- a/src/nvim/testdir/test_normal.vim
+++ b/src/nvim/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/nvim/version.c b/src/nvim/version.c
index 487685ea2e..b652f5fee5 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -94,7 +94,7 @@ static int included_patches[] = {
// 2350,
// 2349,
// 2348,
- // 2347,
+ 2347,
// 2346,
// 2345 NA
// 2344 NA