changeset 13074:66c014c71dad v8.0.1412

patch 8.0.1412: using free memory using setloclist() commit https://github.com/vim/vim/commit/12237448499aaeb8c4f2be7a1deda60c0f160627 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Dec 19 12:38:52 2017 +0100 patch 8.0.1412: using free memory using setloclist() Problem: Using free memory using setloclist(). (Dominique Pelle) Solution: Mark location list context as still in use when needed. (Yegappan Lakshmanan, closes #2462)
author Christian Brabandt <cb@256bit.org>
date Tue, 19 Dec 2017 12:45:06 +0100
parents d790c28d0354
children d25c0dfb3ec6
files src/quickfix.c src/testdir/test_quickfix.vim src/version.c
diffstat 3 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -5486,6 +5486,16 @@ set_ref_in_quickfix(int copyID)
 	    if (abort)
 		return abort;
 	}
+	if (IS_LL_WINDOW(win) && (win->w_llist_ref->qf_refcount == 1))
+	{
+	    /* In a location list window and none of the other windows is
+	     * referring to this location list. Mark the location list
+	     * context as still in use.
+	     */
+	    abort = mark_quickfix_ctx(win->w_llist_ref, copyID);
+	    if (abort)
+		return abort;
+	}
     }
 
     return abort;
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -3017,3 +3017,17 @@ func Test_qf_tick()
   call Xqftick_tests('c')
   call Xqftick_tests('l')
 endfunc
+
+" The following test used to crash Vim.
+" Open the location list window and close the regular window associated with
+" the location list. When the garbage collection runs now, it incorrectly
+" marks the location list context as not in use and frees the context.
+func Test_ll_window_ctx()
+  call setloclist(0, [], 'f')
+  call setloclist(0, [], 'a', {'context' : []})
+  lopen | only
+  call test_garbagecollect_now()
+  echo getloclist(0, {'context' : 1}).context
+  enew | only
+endfunc
+
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1412,
+/**/
     1411,
 /**/
     1410,