Make sure window is still valid in the middle of calling :lopen (#14240)

Make sure that oldwin is not invalid after splitting

Revisit this when porting vim patch v8.1.0892 and related quickfix patches.
This commit is contained in:
Tony Chen
2021-03-29 05:19:59 -07:00
committed by GitHub
parent 8665a96b92
commit aa6adacd77
3 changed files with 26 additions and 0 deletions

View File

@@ -3617,6 +3617,15 @@ static int qf_open_new_cwindow(qf_info_T *qi, int height)
if (win_split(height, flags) == FAIL) {
return FAIL; // not enough room for window
}
// User autocommands may have invalidated the previous window after calling
// win_split, so add a check to ensure that the win is still here
if (IS_LL_STACK(qi) && !win_valid(win)) {
// close the window that was supposed to be for the loclist
win_close(curwin, false);
return FAIL;
}
RESET_BINDING(curwin);
if (IS_LL_STACK(qi)) {

View File

@@ -1301,6 +1301,10 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
p_wh = i;
}
if (!win_valid(oldwin)) {
return FAIL;
}
// Send the window positions to the UI
oldwin->w_pos_changed = true;

View File

@@ -68,4 +68,17 @@ describe('setloclist()', function()
command('lclose | wincmd w | lopen')
eq('foo', get_cur_win_var('quickfix_title'))
end)
it("doesn't crash when when window is closed in the middle #13721", function()
helpers.insert([[
hello world]])
command("vsplit")
command("autocmd WinLeave * :call nvim_win_close(0, v:true)")
command("call setloclist(0, [])")
command("lopen")
helpers.assert_alive()
end)
end)