Mercurial > vim
changeset 30831:fbeebe308514 v9.0.0750
patch 9.0.0750: crash when popup closed in callback
Commit: https://github.com/vim/vim/commit/0abd6cf62d65180dc2c40d67cd95f13b0691f7ea
Author: Bram Moolenaar <Bram@vim.org>
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 14 Oct 2022 18:15:03 +0200 |
parents | 22917862ac81 |
children | 64fffffc3295 |
files | src/drawscreen.c src/proto/syntax.pro src/syntax.c src/version.c |
diffstat | 4 files changed, 8 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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);
--- 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;