diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-03-04 08:39:54 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-04 08:39:54 +0800 |
commit | 446c353a507834a3cbe9007b06e7e0c2c46b5ac7 (patch) | |
tree | 2aefa58b9640f7212c47efe7308f0c148a2863a4 | |
parent | b48ad28a3ee75b35696ed5b06988859906f46fa6 (diff) | |
download | rneovim-446c353a507834a3cbe9007b06e7e0c2c46b5ac7.tar.gz rneovim-446c353a507834a3cbe9007b06e7e0c2c46b5ac7.tar.bz2 rneovim-446c353a507834a3cbe9007b06e7e0c2c46b5ac7.zip |
vim-patch:9.0.1376: accessing invalid memory with put in Visual block mode (#22505)
Problem: Accessing invalid memory with put in Visual block mode.
Solution: Adjust the cursor column if needed.
https://github.com/vim/vim/commit/1c73b65229c25e3c1fd8824ba958f7cc4d604f9c
Co-authored-by: Bram Moolenaar <Bram@vim.org>
-rw-r--r-- | src/nvim/ops.c | 11 | ||||
-rw-r--r-- | src/nvim/testdir/test_put.vim | 11 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/nvim/ops.c b/src/nvim/ops.c index e89844098b..d2a96be5ad 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -3346,7 +3346,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags) ptr += yanklen; // insert block's trailing spaces only if there's text behind - if ((j < count - 1 || !shortline) && spaces) { + if ((j < count - 1 || !shortline) && spaces > 0) { memset(ptr, ' ', (size_t)spaces); ptr += spaces; } else { @@ -3685,6 +3685,15 @@ error: msgmore(nr_lines); curwin->w_set_curswant = true; + // Make sure the cursor is not after the NUL. + int len = (int)strlen(get_cursor_line_ptr()); + if (curwin->w_cursor.col > len) { + if (cur_ve_flags == VE_ALL) { + curwin->w_cursor.coladd = curwin->w_cursor.col - len; + } + curwin->w_cursor.col = len; + } + end: if (cmdmod.cmod_flags & CMOD_LOCKMARKS) { curbuf->b_op_start = orig_start; diff --git a/src/nvim/testdir/test_put.vim b/src/nvim/testdir/test_put.vim index 97af3699a8..25fc5a2f04 100644 --- a/src/nvim/testdir/test_put.vim +++ b/src/nvim/testdir/test_put.vim @@ -235,5 +235,16 @@ func Test_put_visual_mode() set selection& endfunc +func Test_put_visual_block_mode() + enew + exe "norm 0R\<CR>\<C-C>V" + sil exe "norm \<C-V>c \<MiddleDrag>" + set ve=all + sil norm vz=p + + bwipe! + set ve= +endfunc + " vim: shiftwidth=2 sts=2 expandtab |