changeset 24244:827fcf174f15 v8.2.2663

patch 8.2.2663: Vim9: leaking memory when inline function has an error Commit: https://github.com/vim/vim/commit/79efa2e3b3cdab8c21d95ba4ed9cb573566af531 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 27 15:40:11 2021 +0100 patch 8.2.2663: Vim9: leaking memory when inline function has an error Problem: Vim9: leaking memory when inline function has an error. Solution: Free the partially allocated function.
author Bram Moolenaar <Bram@vim.org>
date Sat, 27 Mar 2021 15:45:03 +0100
parents 14bd3e0d0c71
children 5e22bf689c9f
files src/userfunc.c src/version.c
diffstat 2 files changed, 11 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -35,6 +35,8 @@ static char *e_funcref = N_("E718: Funcr
 static char *e_nofunc = N_("E130: Unknown function: %s");
 
 static void funccal_unref(funccall_T *fc, ufunc_T *fp, int force);
+static void func_clear(ufunc_T *fp, int force);
+static int func_free(ufunc_T *fp, int force);
 
     void
 func_init()
@@ -946,7 +948,7 @@ lambda_function_body(
 {
     int		evaluate = evalarg != NULL
 				      && (evalarg->eval_flags & EVAL_EVALUATE);
-    ufunc_T	*ufunc;
+    ufunc_T	*ufunc = NULL;
     exarg_T	eap;
     garray_T	newlines;
     char_u	*cmdline = NULL;
@@ -1000,10 +1002,7 @@ lambda_function_body(
 	goto erret;
     set_ufunc_name(ufunc, name);
     if (hash_add(&func_hashtab, UF2HIKEY(ufunc)) == FAIL)
-    {
-	vim_free(ufunc);
 	goto erret;
-    }
     ufunc->uf_refcount = 1;
     ufunc->uf_args = *newargs;
     newargs->ga_data = NULL;
@@ -1045,6 +1044,7 @@ lambda_function_body(
 
     rettv->vval.v_partial = pt;
     rettv->v_type = VAR_PARTIAL;
+    ufunc = NULL;
     ret = OK;
 
 erret:
@@ -1054,6 +1054,11 @@ erret:
     ga_clear_strings(&newlines);
     ga_clear_strings(newargs);
     ga_clear_strings(default_args);
+    if (ufunc != NULL)
+    {
+	func_clear(ufunc, TRUE);
+	func_free(ufunc, TRUE);
+    }
     return ret;
 }
 
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2663,
+/**/
     2662,
 /**/
     2661,