1
0
forked from aniani/vim

patch 8.2.3833: error from term_start() not caught by try/catch

Problem:    Error from term_start() not caught by try/catch.
Solution:   save and restore did_emsg when applying autocommands. (Ozaki
            Kiichi, closes #9361)
This commit is contained in:
ichizok
2021-12-17 09:44:33 +00:00
committed by Bram Moolenaar
parent 994a0a298b
commit c3f91c0648
3 changed files with 27 additions and 0 deletions

View File

@@ -1891,6 +1891,7 @@ apply_autocmds_group(
int did_save_redobuff = FALSE; int did_save_redobuff = FALSE;
save_redo_T save_redo; save_redo_T save_redo;
int save_KeyTyped = KeyTyped; int save_KeyTyped = KeyTyped;
int save_did_emsg;
ESTACK_CHECK_DECLARATION ESTACK_CHECK_DECLARATION
/* /*
@@ -2171,9 +2172,13 @@ apply_autocmds_group(
// make sure cursor and topline are valid // make sure cursor and topline are valid
check_lnums(TRUE); check_lnums(TRUE);
save_did_emsg = did_emsg;
do_cmdline(NULL, getnextac, (void *)&patcmd, do_cmdline(NULL, getnextac, (void *)&patcmd,
DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT); DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
did_emsg += save_did_emsg;
if (nesting == 1) if (nesting == 1)
// restore cursor and topline, unless they were changed // restore cursor and topline, unless they were changed
reset_lnums(); reset_lnums();

View File

@@ -901,5 +901,25 @@ func Test_terminal_getwinpos()
only! only!
endfunc endfunc
func Test_terminal_term_start_error()
func s:term_start_error() abort
try
return term_start([[]])
catch
return v:exception
finally
"
endtry
endfunc
autocmd WinEnter * call type(0)
" Must not crash in s:term_start_error, nor the exception thrown.
let result = s:term_start_error()
call assert_match('^Vim(return):E730:', result)
autocmd! WinEnter
delfunc s:term_start_error
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3833,
/**/ /**/
3832, 3832,
/**/ /**/