mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
patch 8.2.0381: using freed memory with :lvimgrep and autocommand
Problem: Using freed memory with :lvimgrep and autocommand. (extracted from POC by Dominique Pelle) Solution: Avoid deleting a dummy buffer used in a window. (closes #5777)
This commit is contained in:
@@ -6268,7 +6268,26 @@ load_dummy_buffer(
|
|||||||
static void
|
static void
|
||||||
wipe_dummy_buffer(buf_T *buf, char_u *dirname_start)
|
wipe_dummy_buffer(buf_T *buf, char_u *dirname_start)
|
||||||
{
|
{
|
||||||
if (curbuf != buf) // safety check
|
// If any autocommand opened a window on the dummy buffer, close that
|
||||||
|
// window. If we can't close them all then give up.
|
||||||
|
while (buf->b_nwindows > 0)
|
||||||
|
{
|
||||||
|
int did_one = FALSE;
|
||||||
|
win_T *wp;
|
||||||
|
|
||||||
|
if (firstwin->w_next != NULL)
|
||||||
|
for (wp = firstwin; wp != NULL; wp = wp->w_next)
|
||||||
|
if (wp->w_buffer == buf)
|
||||||
|
{
|
||||||
|
if (win_close(wp, FALSE) == OK)
|
||||||
|
did_one = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!did_one)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curbuf != buf && buf->b_nwindows == 0) // safety check
|
||||||
{
|
{
|
||||||
#if defined(FEAT_EVAL)
|
#if defined(FEAT_EVAL)
|
||||||
cleanup_T cs;
|
cleanup_T cs;
|
||||||
|
@@ -3684,6 +3684,14 @@ func Test_lvimgrep_crash()
|
|||||||
enew | only
|
enew | only
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_lvimgrep_crash2()
|
||||||
|
au BufNewFile x sfind
|
||||||
|
call assert_fails('lvimgrep x x', 'E480:')
|
||||||
|
call assert_fails('lvimgrep x x x', 'E480:')
|
||||||
|
|
||||||
|
au! BufNewFile
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for the position of the quickfix and location list window
|
" Test for the position of the quickfix and location list window
|
||||||
func Test_qfwin_pos()
|
func Test_qfwin_pos()
|
||||||
" Open two windows
|
" Open two windows
|
||||||
|
@@ -738,6 +738,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 */
|
||||||
|
/**/
|
||||||
|
381,
|
||||||
/**/
|
/**/
|
||||||
380,
|
380,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user