# HG changeset patch # User Christian Brabandt # Date 1458391504 -3600 # Node ID 536b9b88d1ca372110ff50edc974add480aeb88c # Parent 35916dba9326d3753fd9d60d96b5bfb6e947cbdc commit https://github.com/vim/vim/commit/0899d698030ec076eb26352cda1ea334ab0819d9 Author: Bram Moolenaar Date: Sat Mar 19 13:35:03 2016 +0100 patch 7.4.1592 Problem: Quickfix code using memory after being freed. (Dominique Pelle) Solution: Detect that the window was closed. (Hirohito Higashi) diff --git a/src/quickfix.c b/src/quickfix.c --- a/src/quickfix.c +++ b/src/quickfix.c @@ -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) { diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim --- a/src/testdir/test_quickfix.vim +++ b/src/testdir/test_quickfix.vim @@ -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("")) + 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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -749,6 +749,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1592, +/**/ 1591, /**/ 1590,