diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-02-01 08:21:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-01 08:21:32 +0800 |
commit | 7880eeb2ee9d4a0d3eeeec58c8af9a144c8d5e77 (patch) | |
tree | 3fb3f084925b659cb956190b27671617e7773b0d | |
parent | 249b9de4056d0e0a57c59bc533a0cf2b96c42436 (diff) | |
download | rneovim-7880eeb2ee9d4a0d3eeeec58c8af9a144c8d5e77.tar.gz rneovim-7880eeb2ee9d4a0d3eeeec58c8af9a144c8d5e77.tar.bz2 rneovim-7880eeb2ee9d4a0d3eeeec58c8af9a144c8d5e77.zip |
vim-patch:9.0.1270: crash when using search stat in narrow screen (#22078)
Problem: Crash when using search stat in narrow screen.
Solution: Check length of message. (closes vim/vim#11921)
https://github.com/vim/vim/commit/a7d36b732070944aab614944075ec0b409311482
-rw-r--r-- | src/nvim/search.c | 7 | ||||
-rw-r--r-- | src/nvim/testdir/test_search_stat.vim | 23 |
2 files changed, 29 insertions, 1 deletions
diff --git a/src/nvim/search.c b/src/nvim/search.c index b24b6ad27c..eb5cc2e07f 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -2644,7 +2644,12 @@ static void cmdline_search_stat(int dirc, pos_T *pos, pos_T *cursor_pos, bool sh len += 2; } - memmove(msgbuf + strlen(msgbuf) - len, t, len); + size_t msgbuf_len = strlen(msgbuf); + if (len > msgbuf_len) { + len = msgbuf_len; + } + memmove(msgbuf + msgbuf_len - len, t, len); + if (dirc == '?' && stat.cur == maxcount + 1) { stat.cur = -1; } diff --git a/src/nvim/testdir/test_search_stat.vim b/src/nvim/testdir/test_search_stat.vim index 77bd50ada2..1b2d854829 100644 --- a/src/nvim/testdir/test_search_stat.vim +++ b/src/nvim/testdir/test_search_stat.vim @@ -270,6 +270,29 @@ func Test_searchcount_fails() call assert_fails('echo searchcount({"pos" : [1, 2, []]})', 'E745:') endfunc +func Test_search_stat_narrow_screen() + " This used to crash Vim + let save_columns = &columns + try + let after =<< trim [CODE] + set laststatus=2 + set columns=16 + set shortmess-=S showcmd + call setline(1, 'abc') + call feedkeys("/abc\<CR>:quit!\<CR>") + autocmd VimLeavePre * call writefile(["done"], "Xdone") + [CODE] + + if !RunVim([], after, '--clean') + return + endif + call assert_equal("done", readfile("Xdone")[0]) + call delete('Xdone') + finally + let &columns = save_columns + endtry +endfunc + func Test_searchcount_in_statusline() CheckScreendump |