aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/quickfix.c10
-rw-r--r--src/nvim/testdir/test_quickfix.vim14
2 files changed, 24 insertions, 0 deletions
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c
index 9d4fb52dc3..47b8e4a3e0 100644
--- a/src/nvim/quickfix.c
+++ b/src/nvim/quickfix.c
@@ -5166,6 +5166,16 @@ bool set_ref_in_quickfix(int copyID)
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/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim
index b009df26b9..db84f6d4a1 100644
--- a/src/nvim/testdir/test_quickfix.vim
+++ b/src/nvim/testdir/test_quickfix.vim
@@ -3298,3 +3298,17 @@ func Test_qfjump()
call Xqfjump_tests('c')
call Xqfjump_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
+