changeset 14956:940def6df43f v8.1.0489

patch 8.1.0489: crash when autocmd clears vimpgrep location list commit https://github.com/vim/vim/commit/b6f1480a6a8b1a6fa4d5da97aeb5f4755b71eb91 Author: Bram Moolenaar <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Sun, 21 Oct 2018 19:00:07 +0200
parents 9a25c06e8803
children 31477976121c
files src/quickfix.c src/testdir/test_quickfix.vim src/version.c
diffstat 3 files changed, 74 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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
 
--- 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,