]> granicus.if.org Git - vim/commitdiff
patch 8.0.1412: using free memory using setloclist() v8.0.1412
authorBram Moolenaar <Bram@vim.org>
Tue, 19 Dec 2017 11:38:52 +0000 (12:38 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 19 Dec 2017 11:38:52 +0000 (12:38 +0100)
Problem:    Using free memory using setloclist(). (Dominique Pelle)
Solution:   Mark location list context as still in use when needed. (Yegappan
            Lakshmanan, closes #2462)

src/quickfix.c
src/testdir/test_quickfix.vim
src/version.c

index d09a334339fe14ddf33bd5bdc236b98aed53d49a..6e80ddfca302a09e55b24ccc9a0f626db443d0e6 100644 (file)
@@ -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;
index 2204574998fb9ee60cda082ea4bd168d44d12ae7..8d0c198ba0005fb9bf22c812aa9d3c231b764341 100644 (file)
@@ -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
+
index ec17e4e67256186ebeea853e7f1cc483fb0da596..22df4f924d1c41fe36e9e43fd522f14ec42c316e 100644 (file)
@@ -771,6 +771,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1412,
 /**/
     1411,
 /**/