Mercurial > vim
diff src/ex_cmds.c @ 23624:f9d02c83f306 v8.2.2354
patch 8.2.2354: crash with a weird combination of autocommands
Commit: https://github.com/vim/vim/commit/797e63b9f2baa1853e7063aac478d663cd02f207
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Jan 15 16:22:52 2021 +0100
patch 8.2.2354: crash with a weird combination of autocommands
Problem: Crash with a weird combination of autocommands.
Solution: Increment b_nwindows when needed. (closes https://github.com/vim/vim/issues/7674)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 15 Jan 2021 16:30:04 +0100 |
parents | 049b1e867137 |
children | 062caef90f7f |
line wrap: on
line diff
--- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -2742,6 +2742,8 @@ do_ecmd( else { win_T *the_curwin = curwin; + int did_decrement; + buf_T *was_curbuf = curbuf; // Set the w_closing flag to avoid that autocommands close the // window. And set b_locked for the same reason. @@ -2754,7 +2756,7 @@ do_ecmd( // Close the link to the current buffer. This will set // oldwin->w_buffer to NULL. u_sync(FALSE); - close_buffer(oldwin, curbuf, + did_decrement = close_buffer(oldwin, curbuf, (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD, FALSE, FALSE); the_curwin->w_closing = FALSE; @@ -2776,7 +2778,15 @@ do_ecmd( goto theend; } if (buf == curbuf) // already in new buffer + { + // close_buffer() has decremented the window count, + // increment it again here and restore w_buffer. + if (did_decrement && buf_valid(was_curbuf)) + ++was_curbuf->b_nwindows; + if (win_valid_any_tab(oldwin) && oldwin->w_buffer == NULL) + oldwin->w_buffer = was_curbuf; auto_buf = TRUE; + } else { #ifdef FEAT_SYN_HL