0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 9.0.1030: using freed memory with the cmdline popup menu

Problem:    Using freed memory with the cmdline popup menu.
Solution:   Clear the popup menu when clearing the matches. (closes #11677)
This commit is contained in:
Bram Moolenaar
2022-12-08 12:00:50 +00:00
parent 84dbf855fb
commit 038e6d20e6
4 changed files with 41 additions and 5 deletions

View File

@@ -369,7 +369,8 @@ cmdline_pum_create(
/* /*
* Display the cmdline completion matches in a popup menu * Display the cmdline completion matches in a popup menu
*/ */
void cmdline_pum_display(void) void
cmdline_pum_display(void)
{ {
pum_display(compl_match_array, compl_match_arraysize, compl_selected); pum_display(compl_match_array, compl_match_arraysize, compl_selected);
} }
@@ -377,7 +378,8 @@ void cmdline_pum_display(void)
/* /*
* Returns TRUE if the cmdline completion popup menu is being displayed. * Returns TRUE if the cmdline completion popup menu is being displayed.
*/ */
int cmdline_pum_active(void) int
cmdline_pum_active(void)
{ {
return pum_visible() && compl_match_array != NULL; return pum_visible() && compl_match_array != NULL;
} }
@@ -386,7 +388,8 @@ int cmdline_pum_active(void)
* Remove the cmdline completion popup menu (if present), free the list of * Remove the cmdline completion popup menu (if present), free the list of
* items and refresh the screen. * items and refresh the screen.
*/ */
void cmdline_pum_remove(void) void
cmdline_pum_remove(void)
{ {
int save_p_lz = p_lz; int save_p_lz = p_lz;
int save_KeyTyped = KeyTyped; int save_KeyTyped = KeyTyped;
@@ -403,7 +406,8 @@ void cmdline_pum_remove(void)
KeyTyped = save_KeyTyped; KeyTyped = save_KeyTyped;
} }
void cmdline_pum_cleanup(cmdline_info_T *cclp) void
cmdline_pum_cleanup(cmdline_info_T *cclp)
{ {
cmdline_pum_remove(); cmdline_pum_remove();
wildmenu_cleanup(cclp); wildmenu_cleanup(cclp);
@@ -413,7 +417,8 @@ void cmdline_pum_cleanup(cmdline_info_T *cclp)
* Returns the starting column number to use for the cmdline completion popup * Returns the starting column number to use for the cmdline completion popup
* menu. * menu.
*/ */
int cmdline_compl_startcol(void) int
cmdline_compl_startcol(void)
{ {
return compl_startcol; return compl_startcol;
} }
@@ -975,6 +980,10 @@ ExpandOne(
FreeWild(xp->xp_numfiles, xp->xp_files); FreeWild(xp->xp_numfiles, xp->xp_files);
xp->xp_numfiles = -1; xp->xp_numfiles = -1;
VIM_CLEAR(orig_save); VIM_CLEAR(orig_save);
// The entries from xp_files may be used in the PUM, remove it.
if (compl_match_array != NULL)
cmdline_pum_remove();
} }
findex = 0; findex = 0;

View File

@@ -0,0 +1,10 @@
| +0#0000001#e0e0e08|!| @14| +0#0000000#0000001| +0&#ffffff0@56
| +0#0000001#ffd7ff255|#| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@56
| +0#0000001#ffd7ff255|&| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@56
| +0#0000001#ffd7ff255|*| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@56
| +0#0000001#ffd7ff255|+@1| @13| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@56
| +0#0000001#ffd7ff255|-@1| @13| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@56
| +0#0000001#ffd7ff255|<| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@56
| +0#0000001#ffd7ff255|=| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@56
| +0#0000001#ffd7ff255|>| @14| +0#0000000#a8a8a8255| +0#4040ff13#ffffff0@56
|:+0#0000000&|!> @72

View File

@@ -2485,6 +2485,21 @@ func Test_wildmenu_pum_from_terminal()
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
endfunc endfunc
func Test_wildmenu_pum_clear_entries()
" This was using freed memory. Run in a terminal to get the pum to update.
let lines =<< trim END
set wildoptions=pum
set wildchar=<C-E>
END
call writefile(lines, 'XwildmenuTest', 'D')
let buf = RunVimInTerminal('-S XwildmenuTest', #{rows: 10})
call term_sendkeys(buf, ":\<C-E>\<C-E>")
call VerifyScreenDump(buf, 'Test_wildmenu_pum_clear_entries_1', {})
set wildoptions& wildchar&
endfunc
" Test for completion after a :substitute command followed by a pipe (|) " Test for completion after a :substitute command followed by a pipe (|)
" character " character
func Test_cmdline_complete_substitute() func Test_cmdline_complete_substitute()

View File

@@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1030,
/**/ /**/
1029, 1029,
/**/ /**/