# HG changeset patch # User Bram Moolenaar # Date 1665764103 -7200 # Node ID fbeebe3085143dead73f0c2d15d7d8bce4958420 # Parent 22917862ac81a2ceed3e623889d266314d1c6049 patch 9.0.0750: crash when popup closed in callback Commit: https://github.com/vim/vim/commit/0abd6cf62d65180dc2c40d67cd95f13b0691f7ea Author: Bram Moolenaar Date: Fri Oct 14 17:04:09 2022 +0100 patch 9.0.0750: crash when popup closed in callback Problem: Crash when popup closed in callback. (Maxim Kim) Solution: In syntax_end_parsing() check that syn_block is valid. diff --git a/src/drawscreen.c b/src/drawscreen.c --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -2486,7 +2486,7 @@ win_update(win_T *wp) // Let the syntax stuff know we skipped a few lines. if (syntax_last_parsed != 0 && syntax_last_parsed + 1 < lnum && syntax_present(wp)) - syntax_end_parsing(syntax_last_parsed + 1); + syntax_end_parsing(wp, syntax_last_parsed + 1); #endif // Display one line. @@ -2601,7 +2601,7 @@ win_update(win_T *wp) #ifdef FEAT_SYN_HL // Let the syntax stuff know we stop parsing here. if (syntax_last_parsed != 0 && syntax_present(wp)) - syntax_end_parsing(syntax_last_parsed + 1); + syntax_end_parsing(wp, syntax_last_parsed + 1); #endif // If we didn't hit the end of the file, and we didn't finish the last diff --git a/src/proto/syntax.pro b/src/proto/syntax.pro --- a/src/proto/syntax.pro +++ b/src/proto/syntax.pro @@ -2,7 +2,7 @@ void syntax_start(win_T *wp, linenr_T lnum); void syn_stack_free_all(synblock_T *block); void syn_stack_apply_changes(buf_T *buf); -void syntax_end_parsing(linenr_T lnum); +void syntax_end_parsing(win_T *wp, linenr_T lnum); int syntax_check_changed(linenr_T lnum); int get_syntax_attr(colnr_T col, int *can_spell, int keep_state); void syntax_clear(synblock_T *block); diff --git a/src/syntax.c b/src/syntax.c --- a/src/syntax.c +++ b/src/syntax.c @@ -1542,10 +1542,12 @@ syn_stack_equal(synstate_T *sp) * lnum -> line below window */ void -syntax_end_parsing(linenr_T lnum) +syntax_end_parsing(win_T *wp, linenr_T lnum) { synstate_T *sp; + if (syn_block != wp->w_s) + return; // not the right window sp = syn_stack_find_entry(lnum); if (sp != NULL && sp->sst_lnum < lnum) sp = sp->sst_next; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 750, +/**/ 749, /**/ 748,