Mercurial > vim
diff src/evalbuffer.c @ 26518:13ba00ef7687 v8.2.3788
patch 8.2.3788: lambda for option that is a function may be freed
Commit: https://github.com/vim/vim/commit/6ae8fae8696623b527c7fb22567f6a3705b2f0dd
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Sun Dec 12 16:26:44 2021 +0000
patch 8.2.3788: lambda for option that is a function may be freed
Problem: Lambda for option that is a function may be garbage collected.
Solution: Set a reference in the funcref. (Yegappan Lakshmanan,
closes #9330)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 12 Dec 2021 17:30:04 +0100 |
parents | 634aed775408 |
children | 2df40c348c70 |
line wrap: on
line diff
--- a/src/evalbuffer.c +++ b/src/evalbuffer.c @@ -26,31 +26,25 @@ set_ref_in_buffers(int copyID) FOR_ALL_BUFFERS(bp) { listener_T *lnr; - typval_T tv; for (lnr = bp->b_listener; !abort && lnr != NULL; lnr = lnr->lr_next) - { - if (lnr->lr_callback.cb_partial != NULL) - { - tv.v_type = VAR_PARTIAL; - tv.vval.v_partial = lnr->lr_callback.cb_partial; - abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL); - } - } + abort = abort || set_ref_in_callback(&lnr->lr_callback, copyID); # ifdef FEAT_JOB_CHANNEL - if (!abort && bp->b_prompt_callback.cb_partial != NULL) - { - tv.v_type = VAR_PARTIAL; - tv.vval.v_partial = bp->b_prompt_callback.cb_partial; - abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL); - } - if (!abort && bp->b_prompt_interrupt.cb_partial != NULL) - { - tv.v_type = VAR_PARTIAL; - tv.vval.v_partial = bp->b_prompt_interrupt.cb_partial; - abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL); - } + if (!abort) + abort = abort || set_ref_in_callback(&bp->b_prompt_callback, copyID); + if (!abort) + abort = abort || set_ref_in_callback(&bp->b_prompt_interrupt, copyID); # endif +#ifdef FEAT_COMPL_FUNC + if (!abort) + abort = abort || set_ref_in_callback(&bp->b_cfu_cb, copyID); + if (!abort) + abort = abort || set_ref_in_callback(&bp->b_ofu_cb, copyID); + if (!abort) + abort = abort || set_ref_in_callback(&bp->b_tsrfu_cb, copyID); +#endif + if (!abort) + abort = abort || set_ref_in_callback(&bp->b_tfu_cb, copyID); if (abort) break; }