summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-12-19 12:38:52 +0100
committerBram Moolenaar <Bram@vim.org>2017-12-19 12:38:52 +0100
commit12237448499aaeb8c4f2be7a1deda60c0f160627 (patch)
tree92baee6548082624214863872245ed013681e1dc
parent2efb323e875d2852f63e41c40641760d1d6b069f (diff)
downloadvim-git-12237448499aaeb8c4f2be7a1deda60c0f160627.tar.gz
patch 8.0.1412: using free memory using setloclist()v8.0.1412
Problem: Using free memory using setloclist(). (Dominique Pelle) Solution: Mark location list context as still in use when needed. (Yegappan Lakshmanan, closes #2462)
-rw-r--r--src/quickfix.c10
-rw-r--r--src/testdir/test_quickfix.vim14
-rw-r--r--src/version.c2
3 files changed, 26 insertions, 0 deletions
diff --git a/src/quickfix.c b/src/quickfix.c
index d09a33433..6e80ddfca 100644
--- 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;
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 220457499..8d0c198ba 100644
--- 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
+
diff --git a/src/version.c b/src/version.c
index ec17e4e67..22df4f924 100644
--- 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,