1
0
forked from aniani/vim

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)
This commit is contained in:
Bram Moolenaar
2017-01-24 19:55:43 +01:00
parent bff6ad1331
commit 941c12da3c
3 changed files with 27 additions and 3 deletions

View File

@@ -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 */

View 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

View File

@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
234,
/**/
233,
/**/