From: Bram Moolenaar Date: Thu, 6 Sep 2018 11:14:43 +0000 (+0200) Subject: patch 8.1.0349: crash when wiping buffer in a callback X-Git-Tag: v8.1.0349 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed5a9d661248a2160368f1b0ab3a1bf74831db04;p=vim 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 index 640816521..d51b92ce5 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 8a1fcef14..90fb8881b 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 fa5b493e8..3446cba75 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 99662218b..f33042675 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 02bcaaede..9d36dec4a 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 743c321c4..c9f9410b6 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 ab77c1365..9e399a656 100644 --- a/src/version.c +++ b/src/version.c @@ -794,6 +794,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 349, /**/ 348, /**/