# HG changeset patch # User Bram Moolenaar # Date 1540141207 -7200 # Node ID 940def6df43fc1d24bc6da1ca44c46ccf22ae2f6 # Parent 9a25c06e8803c4d24e1b38753a00b3c2a52d87b8 patch 8.1.0489: crash when autocmd clears vimpgrep location list commit https://github.com/vim/vim/commit/b6f1480a6a8b1a6fa4d5da97aeb5f4755b71eb91 Author: Bram Moolenaar Date: Sun Oct 21 18:47:43 2018 +0200 patch 8.1.0489: crash when autocmd clears vimpgrep location list Problem: Crash when autocmd clears vimpgrep location list. Solution: Return from qf_jump_edit_buffer() early. (Yegappan Lakshmanan) diff --git a/src/quickfix.c b/src/quickfix.c --- a/src/quickfix.c +++ b/src/quickfix.c @@ -2985,6 +2985,8 @@ qf_jump_edit_buffer( { qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist]; int retval = OK; + int old_qf_curlist = qi->qf_curlist; + int save_qfid = qfl->qf_id; if (qf_ptr->qf_type == 1) { @@ -2993,46 +2995,40 @@ qf_jump_edit_buffer( if (!can_abandon(curbuf, forceit)) { no_write_message(); - retval = FAIL; + return FAIL; } - else - retval = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1, - ECMD_HIDE + ECMD_SET_HELP, - oldwin == curwin ? curwin : NULL); + + retval = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1, + ECMD_HIDE + ECMD_SET_HELP, + oldwin == curwin ? curwin : NULL); } else - { - int old_qf_curlist = qi->qf_curlist; - int save_qfid = qfl->qf_id; - retval = buflist_getfile(qf_ptr->qf_fnum, (linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit); - if (IS_LL_STACK(qi)) - { - // Location list. Check whether the associated window is still - // present and the list is still valid. - if (!win_valid_any_tab(oldwin)) - { - EMSG(_("E924: Current window was closed")); - *opened_window = FALSE; - return NOTDONE; - } - else if (!qflist_valid(oldwin, save_qfid)) - { - EMSG(_(e_loc_list_changed)); - return NOTDONE; - } - } - else if (old_qf_curlist != qi->qf_curlist - || !is_qf_entry_present(qfl, qf_ptr)) - { - if (IS_QF_STACK(qi)) - EMSG(_("E925: Current quickfix was changed")); - else - EMSG(_(e_loc_list_changed)); - return NOTDONE; - } + // If a location list, check whether the associated window is still + // present. + if (IS_LL_STACK(qi) && !win_valid_any_tab(oldwin)) + { + EMSG(_("E924: Current window was closed")); + *opened_window = FALSE; + return NOTDONE; + } + + if (IS_QF_STACK(qi) && !qflist_valid(NULL, save_qfid)) + { + EMSG(_("E925: Current quickfix was changed")); + return NOTDONE; + } + + if (old_qf_curlist != qi->qf_curlist + || !is_qf_entry_present(qfl, qf_ptr)) + { + if (IS_QF_STACK(qi)) + EMSG(_("E925: Current quickfix was changed")); + else + EMSG(_(e_loc_list_changed)); + return NOTDONE; } return retval; diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim --- a/src/testdir/test_quickfix.vim +++ b/src/testdir/test_quickfix.vim @@ -3255,6 +3255,17 @@ func Test_lvimgrep_crash() augroup QF_Test au! augroup END + + new | only + augroup QF_Test + au! + au BufEnter * call setloclist(0, [], 'r') + augroup END + call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:') + augroup QF_Test + au! + augroup END + enew | only endfunc @@ -3337,6 +3348,37 @@ func Test_lhelpgrep_autocmd() call assert_equal('help', &filetype) call assert_equal(1, getloclist(0, {'nr' : '$'}).nr) au! QuickFixCmdPost + + new | only + augroup QF_Test + au! + au BufEnter * call setqflist([], 'f') + augroup END + call assert_fails('helpgrep quickfix', 'E925:') + augroup QF_Test + au! BufEnter + augroup END + + new | only + augroup QF_Test + au! + au BufEnter * call setqflist([], 'r') + augroup END + call assert_fails('helpgrep quickfix', 'E925:') + augroup QF_Test + au! BufEnter + augroup END + + new | only + augroup QF_Test + au! + au BufEnter * call setloclist(0, [], 'r') + augroup END + call assert_fails('lhelpgrep quickfix', 'E926:') + augroup QF_Test + au! BufEnter + augroup END + new | only endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -793,6 +793,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 489, +/**/ 488, /**/ 487,