neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 07d60e8f195c4d17ee860ebb50b80043c2cb1f84
parent a9f810b20320910722a1b1136e9d0ff4ab26e69d
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Wed, 23 Apr 2025 07:22:46 +0800

vim-patch:9.1.1331: Leaking memory with cmdcomplete()

Problem:  Leaking memory with cmdcomplete()
          (zeertzjq, after v9.1.1329)
Solution: free the memory (Girish Palya)

closes: vim/vim#17190

https://github.com/vim/vim/commit/5c3d1e3258872381831f419765f2969f45caaa11

Co-authored-by: Girish Palya <girishji@gmail.com>

Diffstat:
Mruntime/doc/builtin.txt | 2+-
Msrc/nvim/cmdexpand.c | 1+
Msrc/nvim/eval.lua | 2+-
Msrc/nvim/ex_getln.c | 4++--
Mtest/old/testdir/test_autocmd.vim | 6++++++
5 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt @@ -1061,7 +1061,7 @@ clearmatches([{win}]) *clearmatches()* Parameters: ~ • {win} (`integer?`) -cmdcomplete_info([{what}]) *cmdcomplete_info()* +cmdcomplete_info() *cmdcomplete_info()* Returns a |Dictionary| with information about cmdline completion. See |cmdline-completion|. The items are: diff --git a/src/nvim/cmdexpand.c b/src/nvim/cmdexpand.c @@ -1065,6 +1065,7 @@ int showmatches(expand_T *xp, bool wildmenu) // Save cmdline before expansion if (ccline->cmdbuff != NULL) { + xfree(cmdline_orig); cmdline_orig = xstrnsave(ccline->cmdbuff, (size_t)ccline->cmdlen); } diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua @@ -1279,7 +1279,7 @@ M.funcs = { name = 'cmdcomplete_info', params = {}, returns = 'table<string,any>', - signature = 'cmdcomplete_info([{what}])', + signature = 'cmdcomplete_info()', }, col = { args = { 1, 2 }, diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c @@ -1302,8 +1302,8 @@ static int command_line_execute(VimState *state, int key) } // Trigger CmdlineLeavePre autocommand - if (ccline.cmdfirstc != NUL && (s->c == '\n' || s->c == '\r' || s->c == K_KENTER - || s->c == ESC || s->c == Ctrl_C)) { + if (s->c == '\n' || s->c == '\r' || s->c == K_KENTER + || s->c == ESC || s->c == Ctrl_C) { trigger_cmd_autocmd(get_cmdline_type(), EVENT_CMDLINELEAVEPRE); } diff --git a/test/old/testdir/test_autocmd.vim b/test/old/testdir/test_autocmd.vim @@ -1959,6 +1959,12 @@ func Test_Cmdline_Trigger() call assert_equal('', g:log) call feedkeys(":echo hello", "tx") call assert_equal('CmdlineLeavePre', g:log) + let g:count = 0 + autocmd CmdlineLeavePre * let g:count += 1 + call feedkeys(":let c = input('? ')\<cr>B\<cr>", "tx") + call assert_equal(2, g:count) + unlet! g:count + unlet! g:log bw! endfunc