changeset 12164:5d82470552ce v8.0.0962

patch 8.0.0962: crash with virtualedit and joining lines commit https://github.com/vim/vim/commit/9aa156912867c05e0a6480925afe11c590378f09 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 19 15:05:32 2017 +0200 patch 8.0.0962: crash with virtualedit and joining lines Problem: Crash with virtualedit and joining lines. (Joshua T Corbin, Neovim https://github.com/vim/vim/issues/6726) Solution: When using a mark check that coladd is valid.
author Christian Brabandt <cb@256bit.org>
date Sat, 19 Aug 2017 15:15:03 +0200
parents ffe3a2b3fa78
children b5146446134c
files src/Makefile src/misc2.c src/normal.c src/testdir/test_alot.vim src/testdir/test_virtualedit.vim src/version.c
diffstat 6 files changed, 52 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile
+++ b/src/Makefile
@@ -2274,6 +2274,7 @@ test_arglist \
 	test_utf8_comparisons \
 	test_viminfo \
 	test_vimscript \
+	test_virtualedit \
 	test_visual \
 	test_window_cmd \
 	test_window_id \
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -605,7 +605,18 @@ check_cursor_col_win(win_T *win)
     else if (ve_flags == VE_ALL)
     {
 	if (oldcoladd > win->w_cursor.col)
+	{
 	    win->w_cursor.coladd = oldcoladd - win->w_cursor.col;
+	    if (win->w_cursor.col < len && win->w_cursor.coladd > 0)
+	    {
+		int cs, ce;
+
+		/* check that coladd is not more than the char width */
+		getvcol(win, &win->w_cursor, &cs, NULL, &ce);
+		if (win->w_cursor.coladd > ce - cs)
+		    win->w_cursor.coladd = ce - cs;
+	    }
+	}
 	else
 	    /* avoid weird number when there is a miscalculation or overflow */
 	    win->w_cursor.coladd = 0;
--- a/src/normal.c
+++ b/src/normal.c
@@ -1571,7 +1571,12 @@ do_pending_operator(cmdarg_T *cap, int o
 
 	    oap->start = VIsual;
 	    if (VIsual_mode == 'V')
+	    {
 		oap->start.col = 0;
+# ifdef FEAT_VIRTUALEDIT
+		oap->start.coladd = 0;
+# endif
+	    }
 	}
 
 	/*
@@ -7580,6 +7585,7 @@ nv_gomark(cmdarg_T *cap)
     if (!virtual_active())
 	curwin->w_cursor.coladd = 0;
 #endif
+    check_cursor_col();
 #ifdef FEAT_FOLDING
     if (cap->oap->op_type == OP_NOP
 	    && pos != NULL
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -55,4 +55,5 @@ source test_taglist.vim
 source test_timers.vim
 source test_true_false.vim
 source test_unlet.vim
+source test_virtualedit.vim
 source test_window_cmd.vim
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_virtualedit.vim
@@ -0,0 +1,31 @@
+" Tests for 'virtualedit'.
+
+func Test_yank_move_change()
+  split
+  call setline(1, [
+	\ "func foo() error {",
+	\ "\tif n, err := bar();",
+	\ "\terr != nil {",
+	\ "\t\treturn err",
+	\ "\t}",
+	\ "\tn = n * n",
+	\ ])
+  set virtualedit=all
+  set ts=4
+  function! MoveSelectionDown(count) abort
+    normal! m`
+    silent! exe "'<,'>move'>+".a:count
+    norm! ``
+  endfunction
+
+  xmap ]e :<C-U>call MoveSelectionDown(v:count1)<CR>
+  2
+  normal 2gg
+  normal J
+  normal jVj
+  normal ]e
+  normal ce
+  bwipe!
+  set virtualedit=
+  set ts=8
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    962,
+/**/
     961,
 /**/
     960,