# HG changeset patch # User Bram Moolenaar # Date 1642680904 -3600 # Node ID 776db9e02b617c825bb3a11262a63bcb0fea1158 # Parent e6b71732abc949a75fd089d8f05d3adbbecb60af patch 8.2.4151: reading beyond the end of a line Commit: https://github.com/vim/vim/commit/57df9e8a9f9ae1aafdde9b86b10ad907627a87dc Author: Bram Moolenaar Date: Thu Jan 20 12:10:48 2022 +0000 patch 8.2.4151: reading beyond the end of a line Problem: Reading beyond the end of a line. Solution: For block insert only use the offset for correcting the length. diff --git a/src/ops.c b/src/ops.c --- a/src/ops.c +++ b/src/ops.c @@ -529,24 +529,9 @@ block_insert( } if (has_mbyte && spaces > 0) - { - int off; - - // Avoid starting halfway a multi-byte character. - if (b_insert) - { - off = (*mb_head_off)(oldp, oldp + offset + spaces); - spaces -= off; - count -= off; - } - else - { - // spaces fill the gap, the character that's at the edge moves - // right - off = (*mb_head_off)(oldp, oldp + offset); - offset -= off; - } - } + // avoid copying part of a multi-byte character + offset -= (*mb_head_off)(oldp, oldp + offset); + if (spaces < 0) // can happen when the cursor was moved spaces = 0; diff --git a/src/testdir/test_visual.vim b/src/testdir/test_visual.vim --- a/src/testdir/test_visual.vim +++ b/src/testdir/test_visual.vim @@ -1309,5 +1309,14 @@ func Test_visual_reselect_with_count() call delete('XvisualReselect') endfunc +func Test_visual_block_insert_round_off() + new + " The number of characters are tuned to fill a 4096 byte allocated block, + " so that valgrind reports going over the end. + call setline(1, ['xxxxx', repeat('0', 1350), "\t", repeat('x', 60)]) + exe "normal gg0\GI" .. repeat('0', 1320) .. "\" + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4151, +/**/ 4150, /**/ 4149,