]> granicus.if.org Git - vim/commitdiff
patch 8.1.0489: crash when autocmd clears vimpgrep location list v8.1.0489
authorBram Moolenaar <Bram@vim.org>
Sun, 21 Oct 2018 16:47:43 +0000 (18:47 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 21 Oct 2018 16:47:43 +0000 (18:47 +0200)
Problem:    Crash when autocmd clears vimpgrep location list.
Solution:   Return from qf_jump_edit_buffer() early. (Yegappan Lakshmanan)

src/quickfix.c
src/testdir/test_quickfix.vim
src/version.c

index bee56ee7a9a3fd2c904e33bf99ad4685b8a423f9..b899612d874b13af9c350eb96265589c6796e29a 100644 (file)
@@ -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;
index 390a231c76e0d03aca0da1ecfc6ff255dd85d682..01a950f34c80d6319e1efe376e4b5d6a60834a30 100644 (file)
@@ -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
 
index 76187400e266d16b19b47ff590860abce00b1c15..01dfc132cc4e47e1cf4de5a2281657f8a3d50255 100644 (file)
@@ -792,6 +792,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    489,
 /**/
     488,
 /**/