diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-09-06 13:14:43 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-09-06 13:14:43 +0200 |
commit | ed5a9d661248a2160368f1b0ab3a1bf74831db04 (patch) | |
tree | ff7d3eea0f440ae83569fa5f84a4b9a3c831ccc1 | |
parent | e67a7d690a53690eb3c99a1ca7a199e8da159146 (diff) | |
download | vim-git-ed5a9d661248a2160368f1b0ab3a1bf74831db04.tar.gz |
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.txt | 1 | ||||
-rw-r--r-- | src/evalfunc.c | 3 | ||||
-rw-r--r-- | src/globals.h | 7 | ||||
-rw-r--r-- | src/os_unix.c | 12 | ||||
-rw-r--r-- | src/os_win32.c | 10 | ||||
-rw-r--r-- | src/screen.c | 7 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 30 insertions, 12 deletions
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 @@ -795,6 +795,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 349, +/**/ 348, /**/ 347, |