Mercurial > vim
diff src/ex_cmds.c @ 23861:5d11a15dbaa9 v8.2.2472
patch 8.2.2472: crash when using command line window in an autocommand
Commit: https://github.com/vim/vim/commit/aad5f9d79a2b71e9d2581eace3652be156102b9d
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Feb 6 17:30:31 2021 +0100
patch 8.2.2472: crash when using command line window in an autocommand
Problem: Crash when using command line window in an autocommand.
(houyunsong)
Solution: Save and restore au_new_curbuf.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 06 Feb 2021 17:45:03 +0100 |
parents | 7517eb94239b |
children | ea2b697ddea8 |
line wrap: on
line diff
--- 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;