diff src/quickfix.c @ 3918:4f0ddf4137ee v7.3.715

updated for version 7.3.715 Problem: Crash when calling setloclist() in BufUnload autocmd. (Marcin Szamotulski) Solution: Set w_llist to NULL when it was freed. Also add a test. (Christian Brabandt)
author Bram Moolenaar <bram@vim.org>
date Wed, 14 Nov 2012 22:38:08 +0100
parents 4f1c511e71f8
children f4aa43d952f5
line wrap: on
line diff
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -107,7 +107,7 @@ struct efm_S
 };
 
 static int	qf_init_ext __ARGS((qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title));
-static void	qf_new_list __ARGS((qf_info_T *qi, char_u *qf_title));
+static void	qf_new_list __ARGS((qf_info_T *qi, char_u *qf_title, win_T *wp));
 static void	ll_free_all __ARGS((qf_info_T **pqi));
 static int	qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid));
 static qf_info_T *ll_new_list __ARGS((void));
@@ -266,7 +266,7 @@ qf_init_ext(qi, efile, buf, tv, errorfor
 
     if (newlist || qi->qf_curlist == qi->qf_listcount)
 	/* make place for a new list */
-	qf_new_list(qi, qf_title);
+	qf_new_list(qi, qf_title, curwin);
     else if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
 	/* Adding to existing list, find last entry. */
 	for (qfprev = qi->qf_lists[qi->qf_curlist].qf_start;
@@ -885,9 +885,10 @@ qf_init_end:
  * Prepare for adding a new quickfix list.
  */
     static void
-qf_new_list(qi, qf_title)
+qf_new_list(qi, qf_title, wp)
     qf_info_T	*qi;
     char_u	*qf_title;
+    win_T	*wp;
 {
     int		i;
 
@@ -897,7 +898,11 @@ qf_new_list(qi, qf_title)
      * way with ":grep'.
      */
     while (qi->qf_listcount > qi->qf_curlist + 1)
+    {
+	if (wp != NULL && wp->w_llist == qi)
+	    wp->w_llist = NULL;
 	qf_free(qi, --qi->qf_listcount);
+    }
 
     /*
      * When the stack is full, remove to oldest entry
@@ -905,6 +910,8 @@ qf_new_list(qi, qf_title)
      */
     if (qi->qf_listcount == LISTCOUNT)
     {
+	if (wp != NULL && wp->w_llist == qi)
+	    wp->w_llist = NULL;
 	qf_free(qi, 0);
 	for (i = 1; i < LISTCOUNT; ++i)
 	    qi->qf_lists[i - 1] = qi->qf_lists[i];
@@ -3181,7 +3188,7 @@ ex_vimgrep(eap)
 	 eap->cmdidx != CMD_vimgrepadd && eap->cmdidx != CMD_lvimgrepadd)
 					|| qi->qf_curlist == qi->qf_listcount)
 	/* make place for a new list */
-	qf_new_list(qi, *eap->cmdlinep);
+	qf_new_list(qi, *eap->cmdlinep, curwin);
     else if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
 	/* Adding to existing list, find last entry. */
 	for (prevp = qi->qf_lists[qi->qf_curlist].qf_start;
@@ -3747,7 +3754,7 @@ set_errorlist(wp, list, action, title)
 
     if (action == ' ' || qi->qf_curlist == qi->qf_listcount)
 	/* make place for a new list */
-	qf_new_list(qi, title);
+	qf_new_list(qi, title, wp);
     else if (action == 'a' && qi->qf_lists[qi->qf_curlist].qf_count > 0)
 	/* Adding to existing list, find last entry. */
 	for (prevp = qi->qf_lists[qi->qf_curlist].qf_start;
@@ -4029,7 +4036,7 @@ ex_helpgrep(eap)
 #endif
 
 	/* create a new quickfix list */
-	qf_new_list(qi, *eap->cmdlinep);
+	qf_new_list(qi, *eap->cmdlinep, wp);
 
 	/* Go through all directories in 'runtimepath' */
 	p = p_rtp;