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().
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 8a1fcef..90fb888 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -13073,6 +13073,8 @@
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 @@
{
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 fa5b493..3446cba 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1633,9 +1633,10 @@
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 9966221..f330426 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -417,10 +417,14 @@
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 02bcaae..9d36dec 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1529,15 +1529,19 @@
*/
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 743c321..c9f9410 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -10819,8 +10819,11 @@
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 ab77c13..9e399a6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -795,6 +795,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 349,
+/**/
348,
/**/
347,