changeset 14673:f1b7d308de2f v8.1.0349

patch 8.1.0349: crash when wiping buffer in a callback commit https://github.com/vim/vim/commit/ed5a9d661248a2160368f1b0ab3a1bf74831db04 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Sep 6 13:14:43 2018 +0200 patch 8.1.0349: crash when wiping buffer in a callback Problem: Crash when wiping buffer in a callback. Solution: Do not handle messages when only peeking for a character. (closes #2107) Add "redraw_flag" to test_override().
author Christian Brabandt <cb@256bit.org>
date Thu, 06 Sep 2018 13:15:05 +0200
parents a4786c02f58f
children ab03bc29a3d3
files runtime/doc/eval.txt src/evalfunc.c src/globals.h src/os_unix.c src/os_win32.c src/screen.c src/version.c
diffstat 7 files changed, 31 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -8737,6 +8737,7 @@ test_override({name}, {val})				*test_ov
 
 		name	     effect when {val} is non-zero ~
 		redraw       disable the redrawing() function
+		redraw_flag  ignore the RedrawingDisabled flag
 		char_avail   disable the char_avail() function
 		starting     reset the "starting" variable, see below
 		nfa_fail     makes the NFA regexp engine fail to force a
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -13073,6 +13073,8 @@ f_test_override(typval_T *argvars, typva
 
 	if (STRCMP(name, (char_u *)"redraw") == 0)
 	    disable_redraw_for_testing = val;
+	else if (STRCMP(name, (char_u *)"redraw_flag") == 0)
+	    ignore_redraw_flag_for_testing = val;
 	else if (STRCMP(name, (char_u *)"char_avail") == 0)
 	    disable_char_avail_for_testing = val;
 	else if (STRCMP(name, (char_u *)"starting") == 0)
@@ -13095,6 +13097,7 @@ f_test_override(typval_T *argvars, typva
 	{
 	    disable_char_avail_for_testing = FALSE;
 	    disable_redraw_for_testing = FALSE;
+	    ignore_redraw_flag_for_testing = FALSE;
 	    nfa_fail_for_testing = FALSE;
 	    if (save_starting >= 0)
 	    {
--- a/src/globals.h
+++ b/src/globals.h
@@ -1633,9 +1633,10 @@ EXTERN int  alloc_fail_countdown INIT(= 
 EXTERN int  alloc_fail_repeat INIT(= 0);
 
 /* flags set by test_override() */
-EXTERN int  disable_char_avail_for_testing INIT(= 0);
-EXTERN int  disable_redraw_for_testing INIT(= 0);
-EXTERN int  nfa_fail_for_testing INIT(= 0);
+EXTERN int  disable_char_avail_for_testing INIT(= FALSE);
+EXTERN int  disable_redraw_for_testing INIT(= FALSE);
+EXTERN int  ignore_redraw_flag_for_testing INIT(= FALSE);
+EXTERN int  nfa_fail_for_testing INIT(= FALSE);
 
 EXTERN int  in_free_unref_items INIT(= FALSE);
 #endif
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -417,10 +417,14 @@ mch_inchar(
 	    handle_resize();
 
 #ifdef MESSAGE_QUEUE
-	parse_queued_messages();
-	/* If input was put directly in typeahead buffer bail out here. */
-	if (typebuf_changed(tb_change_cnt))
-	    return 0;
+	// Only process messages when waiting.
+	if (wtime != 0)
+	{
+	    parse_queued_messages();
+	    // If input was put directly in typeahead buffer bail out here.
+	    if (typebuf_changed(tb_change_cnt))
+		return 0;
+	}
 #endif
 	if (wtime < 0 && did_start_blocking)
 	    /* blocking and already waited for p_ut */
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1529,15 +1529,19 @@ WaitForChar(long msec, int ignore_input)
      */
     for (;;)
     {
+	// Only process messages when waiting.
+	if (msec != 0)
+	{
 #ifdef MESSAGE_QUEUE
-	parse_queued_messages();
+	    parse_queued_messages();
 #endif
 #ifdef FEAT_MZSCHEME
-	mzvim_check_threads();
+	    mzvim_check_threads();
 #endif
 #ifdef FEAT_CLIENTSERVER
-	serverProcessPendingMessages();
-#endif
+	    serverProcessPendingMessages();
+#endif
+	}
 
 	if (0
 #ifdef FEAT_MOUSE
--- a/src/screen.c
+++ b/src/screen.c
@@ -10819,8 +10819,11 @@ redrawing(void)
 	return 0;
     else
 #endif
-	return (!RedrawingDisabled
-		       && !(p_lz && char_avail() && !KeyTyped && !do_redraw));
+	return ((!RedrawingDisabled
+#ifdef FEAT_EVAL
+		    || ignore_redraw_flag_for_testing
+#endif
+		) && !(p_lz && char_avail() && !KeyTyped && !do_redraw));
 }
 
 /*
--- a/src/version.c
+++ b/src/version.c
@@ -795,6 +795,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    349,
+/**/
     348,
 /**/
     347,