# HG changeset patch # User Christian Brabandt # Date 1485284404 -3600 # Node ID 3d1872fbecc4a21af4a6def8deffe562c4a74e29 # Parent 594fa10064a33f0eb601ee5b21181f2bdf33a0f4 patch 8.0.0234: crash when using put in Visual mode commit https://github.com/vim/vim/commit/941c12da3c087fd04aa6c120a76bf28f19349d96 Author: Bram Moolenaar 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) diff --git a/src/ops.c b/src/ops.c --- 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 */ diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim --- 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\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 diff --git a/src/version.c b/src/version.c --- 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,