From 6ae8fae8696623b527c7fb22567f6a3705b2f0dd Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Sun, 12 Dec 2021 16:26:44 +0000 Subject: 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) --- src/gui_xim.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/gui_xim.c') diff --git a/src/gui_xim.c b/src/gui_xim.c index 6d72ef1d6..4bd1a2eed 100644 --- a/src/gui_xim.c +++ b/src/gui_xim.c @@ -117,7 +117,7 @@ call_imstatusfunc(void) void free_xim_stuff(void) { -#if defined(FEAT_EVAL) && \ +# if defined(FEAT_EVAL) && \ (defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL)) free_callback(&imaf_cb); free_callback(&imsf_cb); @@ -125,6 +125,24 @@ free_xim_stuff(void) } #endif +/* + * Mark the global 'imactivatefunc' and 'imstatusfunc' callbacks with 'copyID' + * so that they are not garbage collected. + */ + int +set_ref_in_im_funcs(int copyID UNUSED) +{ + int abort = FALSE; + +#if defined(FEAT_EVAL) && \ + (defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL)) + abort = set_ref_in_callback(&imaf_cb, copyID); + abort = abort || set_ref_in_callback(&imsf_cb, copyID); +#endif + + return abort; +} + #if defined(FEAT_XIM) || defined(PROTO) -- cgit v1.2.1