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