summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-01-24 19:55:43 +0100
committerBram Moolenaar <Bram@vim.org>2017-01-24 19:55:43 +0100
commit941c12da3c087fd04aa6c120a76bf28f19349d96 (patch)
tree296b78adbc71b98ce21b88a6db0bbaef2e1c9c67 /src
parentbff6ad133195145f810645c0bde7a2a1fdfc37b8 (diff)
downloadvim-941c12da3c087fd04aa6c120a76bf28f19349d96.zip
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)
Diffstat (limited to 'src')
-rw-r--r--src/ops.c15
-rw-r--r--src/testdir/test_put.vim13
-rw-r--r--src/version.c2
3 files changed, 27 insertions, 3 deletions
diff --git a/src/ops.c b/src/ops.c
index 1abb8daa1..2aee03def 100644
--- 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 */
diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim
index 0154de1ec..38c812bc9 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 1b7824354..8622e6d17 100644
--- 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,