# HG changeset patch # User Christian Brabandt # Date 1536232505 -7200 # Node ID f1b7d308de2f1efa979ea0915d8391c297e3c763 # Parent a4786c02f58f5c0d18ac0b875ac4b246eef53424 patch 8.1.0349: crash when wiping buffer in a callback commit https://github.com/vim/vim/commit/ed5a9d661248a2160368f1b0ab3a1bf74831db04 Author: Bram Moolenaar 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(). diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- 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 diff --git a/src/evalfunc.c b/src/evalfunc.c --- 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) { diff --git a/src/globals.h b/src/globals.h --- 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 diff --git a/src/os_unix.c b/src/os_unix.c --- 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 --- 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 diff --git a/src/screen.c b/src/screen.c --- 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 --- 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,