mirror of
https://github.com/neovim/neovim.git
synced 2025-09-11 22:08:18 +00:00
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:
@@ -3617,6 +3617,15 @@ static int qf_open_new_cwindow(qf_info_T *qi, int height)
|
|||||||
if (win_split(height, flags) == FAIL) {
|
if (win_split(height, flags) == FAIL) {
|
||||||
return FAIL; // not enough room for window
|
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);
|
RESET_BINDING(curwin);
|
||||||
|
|
||||||
if (IS_LL_STACK(qi)) {
|
if (IS_LL_STACK(qi)) {
|
||||||
|
@@ -1301,6 +1301,10 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
|
|||||||
p_wh = i;
|
p_wh = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!win_valid(oldwin)) {
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
// Send the window positions to the UI
|
// Send the window positions to the UI
|
||||||
oldwin->w_pos_changed = true;
|
oldwin->w_pos_changed = true;
|
||||||
|
|
||||||
|
@@ -68,4 +68,17 @@ describe('setloclist()', function()
|
|||||||
command('lclose | wincmd w | lopen')
|
command('lclose | wincmd w | lopen')
|
||||||
eq('foo', get_cur_win_var('quickfix_title'))
|
eq('foo', get_cur_win_var('quickfix_title'))
|
||||||
end)
|
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)
|
end)
|
||||||
|
Reference in New Issue
Block a user