0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.1948: GUI: crash when handling message while closing a window

Problem:    GUI: crash when handling message while closing a window. (Srinath
            Avadhanula)
Solution:   Don't handle message while closing a window. (closes #7250)
This commit is contained in:
Bram Moolenaar
2020-11-04 11:03:12 +01:00
parent c136a3528b
commit 4778b4d0e1
4 changed files with 18 additions and 1 deletions

View File

@@ -2155,7 +2155,8 @@ parse_queued_messages(void)
// Do not handle messages while redrawing, because it may cause buffers to // Do not handle messages while redrawing, because it may cause buffers to
// change or be wiped while they are being redrawn. // change or be wiped while they are being redrawn.
if (updating_screen) // Also bail out when parsing messages was explicitly disabled.
if (updating_screen || dont_parse_messages)
return; return;
// If memory allocation fails during startup we'll exit but curbuf or // If memory allocation fails during startup we'll exit but curbuf or

View File

@@ -581,6 +581,12 @@ EXTERN int diff_need_scrollbind INIT(= FALSE);
// ('lines' and 'rows') must not be changed. // ('lines' and 'rows') must not be changed.
EXTERN int updating_screen INIT(= FALSE); EXTERN int updating_screen INIT(= FALSE);
#ifdef MESSAGE_QUEUE
// While closing windows or buffers messages should not be handled to avoid
// using invalid windows or buffers.
EXTERN int dont_parse_messages INIT(= FALSE);
#endif
#ifdef FEAT_MENU #ifdef FEAT_MENU
// The root of the menu hierarchy. // The root of the menu hierarchy.
EXTERN vimmenu_T *root_menu INIT(= NULL); EXTERN vimmenu_T *root_menu INIT(= NULL);

View File

@@ -750,6 +750,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 */
/**/
1948,
/**/ /**/
1947, 1947,
/**/ /**/

View File

@@ -2569,7 +2569,12 @@ win_close(win_T *win, int free_buf)
// Now we are really going to close the window. Disallow any autocommand // Now we are really going to close the window. Disallow any autocommand
// to split a window to avoid trouble. // to split a window to avoid trouble.
// Also bail out of parse_queued_messages() to avoid it tries to update the
// screen.
++split_disallowed; ++split_disallowed;
#ifdef MESSAGE_QUEUE
++dont_parse_messages;
#endif
// Free the memory used for the window and get the window that received // Free the memory used for the window and get the window that received
// the screen space. // the screen space.
@@ -2626,6 +2631,9 @@ win_close(win_T *win, int free_buf)
} }
--split_disallowed; --split_disallowed;
#ifdef MESSAGE_QUEUE
--dont_parse_messages;
#endif
/* /*
* If last window has a status line now and we don't want one, * If last window has a status line now and we don't want one,