]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 7.4.1592 v7.4.1592
authorBram Moolenaar <Bram@vim.org>
Sat, 19 Mar 2016 12:35:03 +0000 (13:35 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 19 Mar 2016 12:35:03 +0000 (13:35 +0100)
Problem:    Quickfix code using memory after being freed. (Dominique Pelle)
Solution:   Detect that the window was closed. (Hirohito Higashi)

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

index 8dfad2ec84c04fe27148840e577bce4f22c994c9..2a96240aa65527b9b1cdb712d336d5d434e28ed7 100644 (file)
@@ -1795,8 +1795,19 @@ win_found:
                                           oldwin == curwin ? curwin : NULL);
        }
        else
+       {
            ok = buflist_getfile(qf_ptr->qf_fnum,
                            (linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit);
+           if (qi != &ql_info && !win_valid(oldwin))
+           {
+               EMSG(_("E924: Current window was closed"));
+               ok = FALSE;
+               qi = NULL;
+               qf_ptr = NULL;
+               opened_window = FALSE;
+           }
+       }
+
     }
 
     if (ok == OK)
@@ -1899,7 +1910,7 @@ win_found:
        if (opened_window)
            win_close(curwin, TRUE);    /* Close opened window */
 #endif
-       if (qf_ptr->qf_fnum != 0)
+       if (qf_ptr != NULL && qf_ptr->qf_fnum != 0)
        {
            /*
             * Couldn't open file, so put index back where it was.  This could
@@ -1913,8 +1924,11 @@ failed:
        }
     }
 theend:
-    qi->qf_lists[qi->qf_curlist].qf_ptr = qf_ptr;
-    qi->qf_lists[qi->qf_curlist].qf_index = qf_index;
+    if (qi != NULL)
+    {
+       qi->qf_lists[qi->qf_curlist].qf_ptr = qf_ptr;
+       qi->qf_lists[qi->qf_curlist].qf_index = qf_index;
+    }
 #ifdef FEAT_WINDOWS
     if (p_swb != old_swb && opened_window)
     {
index 5982aeef1b80ec9bacaaf68c238ee0c56097aa58..22a7e673247aea211631d2ed4e49feea1fef800c 100644 (file)
@@ -495,3 +495,22 @@ function Test_locationlist()
 
     augroup! testgroup
 endfunction
+
+function Test_locationlist_curwin_was_closed()
+    augroup testgroup
+      au!
+      autocmd BufReadCmd t call R(expand("<amatch>"))
+    augroup END
+
+    function R(n)
+      quit
+    endfunc
+
+    new
+    let q = []
+    call add(q, {'filename': 't' })
+    call setloclist(0, q)
+    call assert_fails('lrewind', 'E924:')
+
+    augroup! testgroup
+endfunction
index f2e7d67fcd4ac5dfa46dcbd6743f2a33e92f61ae..409a9f40ba7e43680a49238b2d238934d2f8347b 100644 (file)
@@ -748,6 +748,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1592,
 /**/
     1591,
 /**/