]> granicus.if.org Git - vim/commitdiff
patch 8.0.0234: crash when using put in Visual mode v8.0.0234
authorBram Moolenaar <Bram@vim.org>
Tue, 24 Jan 2017 18:55:43 +0000 (19:55 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 24 Jan 2017 18:55:43 +0000 (19:55 +0100)
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)

src/ops.c
src/testdir/test_put.vim
src/version.c

index 1abb8daa1fe9b042bc9d060d031fa82e18c2c3d1..2aee03deff373f88a5d24ebc56cf71d99ea27b65 100644 (file)
--- 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;
+           linenr_T end;
 
-           if (curbuf->b_visual.vi_end.lnum < curbuf->b_visual.vi_start.lnum)
-               end = curbuf->b_visual.vi_start.lnum;
+           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 */
index 0154de1ec05f1988825e59952e61fd8fee4ff893..38c812bc9c64fd87a2c74d9e429de46c77dd70e8 100644 (file)
@@ -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
index 1b78243549dbce895084218565ac3d9c836606af..8622e6d17a0530dcbf7297d0a68666bb9891279d 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    234,
 /**/
     233,
 /**/