0
0
mirror of https://github.com/vim/vim.git synced 2025-10-05 05:34:07 -04:00

patch 9.0.0490: using freed memory with cmdwin and BufEnter autocmd

Problem:    Using freed memory with cmdwin and BufEnter autocmd.
Solution:   Make sure pointer to b_p_iminsert is still valid.
This commit is contained in:
Bram Moolenaar
2022-09-17 19:43:23 +01:00
parent fb593c5350
commit 1c3dd8ddcb
3 changed files with 18 additions and 2 deletions

View File

@@ -1587,6 +1587,7 @@ getcmdline_int(
#endif #endif
expand_T xpc; expand_T xpc;
long *b_im_ptr = NULL; long *b_im_ptr = NULL;
buf_T *b_im_ptr_buf = NULL; // buffer where b_im_ptr is valid
cmdline_info_T save_ccline; cmdline_info_T save_ccline;
int did_save_ccline = FALSE; int did_save_ccline = FALSE;
int cmdline_type; int cmdline_type;
@@ -1683,6 +1684,7 @@ getcmdline_int(
b_im_ptr = &curbuf->b_p_iminsert; b_im_ptr = &curbuf->b_p_iminsert;
else else
b_im_ptr = &curbuf->b_p_imsearch; b_im_ptr = &curbuf->b_p_imsearch;
b_im_ptr_buf = curbuf;
if (*b_im_ptr == B_IMODE_LMAP) if (*b_im_ptr == B_IMODE_LMAP)
State |= MODE_LANGMAP; State |= MODE_LANGMAP;
#ifdef HAVE_INPUT_METHOD #ifdef HAVE_INPUT_METHOD
@@ -2034,7 +2036,8 @@ getcmdline_int(
goto cmdline_not_changed; goto cmdline_not_changed;
case Ctrl_HAT: case Ctrl_HAT:
cmdline_toggle_langmap(b_im_ptr); cmdline_toggle_langmap(
buf_valid(b_im_ptr_buf) ? b_im_ptr : NULL);
goto cmdline_not_changed; goto cmdline_not_changed;
// case '@': only in very old vi // case '@': only in very old vi
@@ -2544,7 +2547,8 @@ returncmd:
#endif #endif
#ifdef HAVE_INPUT_METHOD #ifdef HAVE_INPUT_METHOD
if (b_im_ptr != NULL && *b_im_ptr != B_IMODE_LMAP) if (b_im_ptr != NULL && buf_valid(b_im_ptr_buf)
&& *b_im_ptr != B_IMODE_LMAP)
im_save_status(b_im_ptr); im_save_status(b_im_ptr);
im_set_active(FALSE); im_set_active(FALSE);
#endif #endif

View File

@@ -378,5 +378,15 @@ func Test_normal_escape()
call assert_equal('" bar', @:) call assert_equal('" bar', @:)
endfunc endfunc
" This was using a pointer to a freed buffer
func Test_cmdwin_freed_buffer_ptr()
au BufEnter * next 0| file
edit 0
silent! norm q/
au! BufEnter
bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -703,6 +703,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 */
/**/
490,
/**/ /**/
489, 489,
/**/ /**/