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:
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