diff --git a/src/testdir/crash/poc_win_enter_ext b/src/testdir/crash/poc_win_enter_ext new file mode 100644 index 0000000000..73f53b575b Binary files /dev/null and b/src/testdir/crash/poc_win_enter_ext differ diff --git a/src/testdir/test_crash.vim b/src/testdir/test_crash.vim index b093b053c5..11c5f4e014 100644 --- a/src/testdir/test_crash.vim +++ b/src/testdir/test_crash.vim @@ -128,6 +128,13 @@ func Test_crash1_2() \ ' && echo "crash 1: [OK]" > '.. result .. "\") call TermWait(buf, 150) + let file = 'crash/poc_win_enter_ext' + let cmn_args = "%s -u NONE -i NONE -n -e -s -S %s -c ':qa!'" + let args = printf(cmn_args, vim, file) + call term_sendkeys(buf, args .. + \ ' && echo "crash 2: [OK]" >> '.. result .. "\") + call TermWait(buf, 350) + " clean up exe buf .. "bw!" @@ -135,6 +142,7 @@ func Test_crash1_2() let expected = [ \ 'crash 1: [OK]', + \ 'crash 2: [OK]', \ ] call assert_equal(expected, getline(1, '$')) diff --git a/src/version.c b/src/version.c index 3fc23c17e5..e32e5c006d 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2140, /**/ 2139, /**/ diff --git a/src/window.c b/src/window.c index 0f4363b942..be010dc7fd 100644 --- a/src/window.c +++ b/src/window.c @@ -5013,6 +5013,7 @@ tabpage_move(int nr) * Go to another window. * When jumping to another buffer, stop Visual mode. Do this before * changing windows so we can yank the selection into the '*' register. + * (note: this may trigger ModeChanged autocommand!) * When jumping to another window on the same buffer, adjust its cursor * position to keep the same Visual area. */ @@ -5039,10 +5040,15 @@ win_goto(win_T *wp) } if (wp->w_buffer != curbuf) + // careful: triggers ModeChanged autocommand reset_VIsual_and_resel(); else if (VIsual_active) wp->w_cursor = curwin->w_cursor; + // autocommand may have made wp invalid + if (!win_valid(wp)) + return; + #ifdef FEAT_GUI need_mouse_correct = TRUE; #endif