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/ops.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/ops.c') diff --git a/src/ops.c b/src/ops.c index a1afc258e..f58d6f8d1 100644 --- a/src/ops.c +++ b/src/ops.c @@ -3341,12 +3341,28 @@ set_operatorfunc_option(void) void free_operatorfunc_option(void) { -# ifdef FEAT_EVAL +# ifdef FEAT_EVAL free_callback(&opfunc_cb); -# endif +# endif } #endif +/* + * Mark the global 'operatorfunc' callback with 'copyID' so that it is not + * garbage collected. + */ + int +set_ref_in_opfunc(int copyID UNUSED) +{ + int abort = FALSE; + +#ifdef FEAT_EVAL + abort = set_ref_in_callback(&opfunc_cb, copyID); +#endif + + return abort; +} + /* * Handle the "g@" operator: call 'operatorfunc'. */ -- cgit v1.2.1