changeset 10688:3d1872fbecc4 v8.0.0234

patch 8.0.0234: crash when using put in Visual mode commit https://github.com/vim/vim/commit/941c12da3c087fd04aa6c120a76bf28f19349d96 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jan 24 19:55:43 2017 +0100 patch 8.0.0234: crash when using put in Visual mode Problem: When several lines are visually selected and one of them is short, using put may cause a crash. (Axel Bender) Solution: Check for a short line. (Christian Brabandt)
author Christian Brabandt <cb@256bit.org>
date Tue, 24 Jan 2017 20:00:04 +0100
parents 594fa10064a3
children 014e96879a1d
files src/ops.c src/testdir/test_put.vim src/version.c
diffstat 3 files changed, 28 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/ops.c
+++ b/src/ops.c
@@ -3774,16 +3774,25 @@ do_put(
 	 */
 	if (y_type == MCHAR && y_size == 1)
 	{
-	    linenr_T end = curbuf->b_visual.vi_end.lnum;
-
-	    if (curbuf->b_visual.vi_end.lnum < curbuf->b_visual.vi_start.lnum)
-		end = curbuf->b_visual.vi_start.lnum;
+	    linenr_T end;
+
+	    if (VIsual_active)
+	    {
+		end = curbuf->b_visual.vi_end.lnum;
+		if (end < curbuf->b_visual.vi_start.lnum)
+		    end = curbuf->b_visual.vi_start.lnum;
+	    }
 
 	    do {
 		totlen = count * yanklen;
 		if (totlen > 0)
 		{
 		    oldp = ml_get(lnum);
+		    if (VIsual_active && col > (int)STRLEN(oldp))
+		    {
+			lnum++;
+			continue;
+		    }
 		    newp = alloc_check((unsigned)(STRLEN(oldp) + totlen + 1));
 		    if (newp == NULL)
 			goto end;	/* alloc() gave an error message */
--- a/src/testdir/test_put.vim
+++ b/src/testdir/test_put.vim
@@ -21,3 +21,16 @@ func Test_put_char_block()
   call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2))
   bw!
 endfunc
+
+func Test_put_char_block2()
+  new
+  let a = [ getreg('a'), getregtype('a') ]
+  call setreg('a', ' one ', 'v')
+  call setline(1, ['Line 1', '', 'Line 3', ''])
+  " visually select the first 3 lines and put register a over it
+  exe "norm! ggl\<c-v>2j2l\"ap"
+  call assert_equal(['L one  1', '', 'L one  3', ''], getline(1,4))
+  " clean up
+  bw!
+  call setreg('a', a[0], a[1])
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    234,
+/**/
     233,
 /**/
     232,