1
0
forked from aniani/vim

patch 7.4.1640

Problem:    Crash when an autocommand changes a quickfix list. (Dominique)
Solution:   Check wether an entry is still valid. (Yegappan Lakshmanan,
            Hirohito Higashi)
This commit is contained in:
Bram Moolenaar
2016-03-23 20:55:42 +01:00
parent 5f436fcf99
commit ffec3c5349
4 changed files with 95 additions and 4 deletions

View File

@@ -1412,6 +1412,33 @@ qf_guess_filepath(char_u *filename)
}
/*
* When loading a file from the quickfix, the auto commands may modify it.
* This may invalidate the current quickfix entry. This function checks
* whether a entry is still present in the quickfix.
* Similar to location list.
*/
static int
is_qf_entry_present(qf_info_T *qi, qfline_T *qf_ptr)
{
qf_list_T *qfl;
qfline_T *qfp;
int i;
qfl = &qi->qf_lists[qi->qf_curlist];
/* Search for the entry in the current list */
for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count;
++i, qfp = qfp->qf_next)
if (qfp == qf_ptr)
break;
if (i == qfl->qf_count) /* Entry is not found */
return FALSE;
return TRUE;
}
/*
* jump to a quickfix line
* if dir == FORWARD go "errornr" valid entries forward
@@ -1794,18 +1821,34 @@ win_found:
}
else
{
int old_qf_curlist = qi->qf_curlist;
int is_abort = FALSE;
ok = buflist_getfile(qf_ptr->qf_fnum,
(linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit);
if (qi != &ql_info && !win_valid(oldwin))
{
EMSG(_("E924: Current window was closed"));
is_abort = TRUE;
opened_window = FALSE;
}
else if (old_qf_curlist != qi->qf_curlist
|| !is_qf_entry_present(qi, qf_ptr))
{
if (qi == &ql_info)
EMSG(_("E925: Current quickfix was changed"));
else
EMSG(_("E926: Current location list was changed"));
is_abort = TRUE;
}
if (is_abort)
{
ok = FALSE;
qi = NULL;
qf_ptr = NULL;
opened_window = FALSE;
}
}
}
if (ok == OK)