summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-02-06 17:30:31 +0100
committerBram Moolenaar <Bram@vim.org>2021-02-06 17:30:31 +0100
commitaad5f9d79a2b71e9d2581eace3652be156102b9d (patch)
treecb56b72a943e0bd284e68179332e05dc6f778e11
parentefa1923565f0669d5bc09714b22a3b50cde03785 (diff)
downloadvim-git-aad5f9d79a2b71e9d2581eace3652be156102b9d.tar.gz
patch 8.2.2472: crash when using command line window in an autocommandv8.2.2472
Problem: Crash when using command line window in an autocommand. (houyunsong) Solution: Save and restore au_new_curbuf.
-rw-r--r--src/ex_cmds.c11
-rw-r--r--src/testdir/test_autocmd.vim19
-rw-r--r--src/version.c2
3 files changed, 27 insertions, 5 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index b6e1cbf7f..90a9403ff 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -2710,8 +2710,9 @@ do_ecmd(
*/
if (buf != curbuf)
{
+ bufref_T save_au_new_curbuf;
#ifdef FEAT_CMDWIN
- int save_cmdwin_type = cmdwin_type;
+ int save_cmdwin_type = cmdwin_type;
// BufLeave applies to the old buffer.
cmdwin_type = 0;
@@ -2728,6 +2729,7 @@ do_ecmd(
*/
if (buf->b_fname != NULL)
new_name = vim_strsave(buf->b_fname);
+ save_au_new_curbuf = au_new_curbuf;
set_bufref(&au_new_curbuf, buf);
apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf);
#ifdef FEAT_CMDWIN
@@ -2737,12 +2739,14 @@ do_ecmd(
{
// new buffer has been deleted
delbuf_msg(new_name); // frees new_name
+ au_new_curbuf = save_au_new_curbuf;
goto theend;
}
#ifdef FEAT_EVAL
if (aborting()) // autocmds may abort script processing
{
vim_free(new_name);
+ au_new_curbuf = save_au_new_curbuf;
goto theend;
}
#endif
@@ -2778,6 +2782,7 @@ do_ecmd(
if (aborting() && curwin->w_buffer != NULL)
{
vim_free(new_name);
+ au_new_curbuf = save_au_new_curbuf;
goto theend;
}
#endif
@@ -2786,6 +2791,7 @@ do_ecmd(
{
// new buffer has been deleted
delbuf_msg(new_name); // frees new_name
+ au_new_curbuf = save_au_new_curbuf;
goto theend;
}
if (buf == curbuf) // already in new buffer
@@ -2831,8 +2837,7 @@ do_ecmd(
#endif
}
vim_free(new_name);
- au_new_curbuf.br_buf = NULL;
- au_new_curbuf.br_buf_free_count = 0;
+ au_new_curbuf = save_au_new_curbuf;
}
curwin->w_pcmark.lnum = 1;
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index cb5c62f52..8ccc753df 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -2739,9 +2739,9 @@ func Test_autocmd_closes_window()
au BufNew,BufWinLeave * e %e
file yyy
au BufNew,BufWinLeave * ball
- call assert_fails('n xxx', 'E143:')
+ n xxx
- bwipe %
+ %bwipe
au! BufNew
au! BufWinLeave
endfunc
@@ -2759,4 +2759,19 @@ func Test_autocmd_quit_psearch()
augroup END
endfunc
+" Fuzzer found some strange combination that caused a crash.
+func Test_autocmd_normal_mess()
+ augroup aucmd_normal_test
+ au BufLeave,BufWinLeave,BufHidden,BufUnload,BufDelete,BufWipeout * norm 7q/qc
+ augroup END
+ o4
+ silent! H
+ e xx
+ normal G
+
+ augroup aucmd_normal_test
+ au!
+ augroup END
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 2beec07bc..1b0faaeee 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2472,
+/**/
2471,
/**/
2470,