summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-09-06 13:14:43 +0200
committerBram Moolenaar <Bram@vim.org>2018-09-06 13:14:43 +0200
commited5a9d661248a2160368f1b0ab3a1bf74831db04 (patch)
treeff7d3eea0f440ae83569fa5f84a4b9a3c831ccc1
parente67a7d690a53690eb3c99a1ca7a199e8da159146 (diff)
patch 8.1.0349: crash when wiping buffer in a callbackv8.1.0349
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().
-rw-r--r--runtime/doc/eval.txt1
-rw-r--r--src/evalfunc.c3
-rw-r--r--src/globals.h7
-rw-r--r--src/os_unix.c12
-rw-r--r--src/os_win32.c10
-rw-r--r--src/screen.c7
-rw-r--r--src/version.c2
7 files changed, 30 insertions, 12 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 6408165214..d51b92ce5f 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -8737,6 +8737,7 @@ test_override({name}, {val}) *test_override()*
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
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 8a1fcef14b..90fb8881b4 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -13073,6 +13073,8 @@ f_test_override(typval_T *argvars, typval_T *rettv UNUSED)
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, typval_T *rettv UNUSED)
{
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)
{
diff --git a/src/globals.h b/src/globals.h
index fa5b493e8a..3446cba751 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1633,9 +1633,10 @@ EXTERN int alloc_fail_countdown INIT(= -1);
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
diff --git a/src/os_unix.c b/src/os_unix.c
index 99662218b6..f33042675d 100644
--- 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 */
diff --git a/src/os_win32.c b/src/os_win32.c
index 02bcaaede9..9d36dec4a5 100644
--- 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();
+ serverProcessPendingMessages();
#endif
+ }
if (0
#ifdef FEAT_MOUSE
diff --git a/src/screen.c b/src/screen.c
index 743c321c47..c9f9410b6a 100644
--- 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));
}
/*
diff --git a/src/version.c b/src/version.c
index ab77c13653..9e399a656d 100644
--- 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,