mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
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:
15
src/ops.c
15
src/ops.c
@@ -3774,16 +3774,25 @@ do_put(
|
|||||||
*/
|
*/
|
||||||
if (y_type == MCHAR && y_size == 1)
|
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)
|
if (VIsual_active)
|
||||||
end = curbuf->b_visual.vi_start.lnum;
|
{
|
||||||
|
end = curbuf->b_visual.vi_end.lnum;
|
||||||
|
if (end < curbuf->b_visual.vi_start.lnum)
|
||||||
|
end = curbuf->b_visual.vi_start.lnum;
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
totlen = count * yanklen;
|
totlen = count * yanklen;
|
||||||
if (totlen > 0)
|
if (totlen > 0)
|
||||||
{
|
{
|
||||||
oldp = ml_get(lnum);
|
oldp = ml_get(lnum);
|
||||||
|
if (VIsual_active && col > (int)STRLEN(oldp))
|
||||||
|
{
|
||||||
|
lnum++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
newp = alloc_check((unsigned)(STRLEN(oldp) + totlen + 1));
|
newp = alloc_check((unsigned)(STRLEN(oldp) + totlen + 1));
|
||||||
if (newp == NULL)
|
if (newp == NULL)
|
||||||
goto end; /* alloc() gave an error message */
|
goto end; /* alloc() gave an error message */
|
||||||
|
@@ -21,3 +21,16 @@ func Test_put_char_block()
|
|||||||
call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2))
|
call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2))
|
||||||
bw!
|
bw!
|
||||||
endfunc
|
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
|
||||||
|
@@ -764,6 +764,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
234,
|
||||||
/**/
|
/**/
|
||||||
233,
|
233,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user