Mercurial > vim
changeset 3982:4934eb2e22dc v7.3.746
updated for version 7.3.746
Problem: Memory leaks when using location lists.
Solution: Set qf_title to something. (Christian Brabandt)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 05 Dec 2012 15:16:47 +0100 |
parents | b97ab967c4fb |
children | 78f94fab8bf4 |
files | src/eval.c src/quickfix.c src/version.c |
diffstat | 3 files changed, 12 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -16292,7 +16292,8 @@ set_qf_ll_list(wp, list_arg, action_arg, action = *act; } - if (l != NULL && set_errorlist(wp, l, action, NULL) == OK) + if (l != NULL && set_errorlist(wp, l, action, + (char_u *)(wp == NULL ? "setqflist()" : "setloclist()")) == OK) rettv->vval.v_number = 0; } #endif
--- a/src/quickfix.c +++ b/src/quickfix.c @@ -2124,15 +2124,22 @@ qf_free(qi, idx) int idx; { qfline_T *qfp; + int stop = FALSE; while (qi->qf_lists[idx].qf_count) { qfp = qi->qf_lists[idx].qf_start->qf_next; - if (qi->qf_lists[idx].qf_title != NULL) + if (qi->qf_lists[idx].qf_title != NULL && !stop) { vim_free(qi->qf_lists[idx].qf_start->qf_text); + stop = (qi->qf_lists[idx].qf_start == qfp); vim_free(qi->qf_lists[idx].qf_start->qf_pattern); vim_free(qi->qf_lists[idx].qf_start); + if (stop) + /* Somehow qf_count may have an incorrect value, set it to 1 + * to avoid crashing when it's wrong. + * TODO: Avoid qf_count being incorrect. */ + qi->qf_lists[idx].qf_count = 1; } qi->qf_lists[idx].qf_start = qfp; --qi->qf_lists[idx].qf_count;