diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-04-14 17:06:43 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-04-14 17:06:43 +0200 |
commit | b47bed2f7ada4dfae78f76f27473b83507e40315 (patch) | |
tree | 1ff4232659664ff3832adaaca98702a8e291f654 /src/userfunc.c | |
parent | a3589a0d6cdb314e70421c0f2e5a2d1abf68e597 (diff) |
patch 8.2.2764: memory leak when default function argument is allocatedv8.2.2764
Problem: Memory leak when default function argument is allocated.
Solution: Free the expression result.
Diffstat (limited to 'src/userfunc.c')
-rw-r--r-- | src/userfunc.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/userfunc.c b/src/userfunc.c index 772d45d126..99d4e0334e 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -2188,6 +2188,8 @@ call_user_func( int islambda = FALSE; char_u numbuf[NUMBUFLEN]; char_u *name; + typval_T *tv_to_free[MAX_FUNC_ARGS]; + int tv_to_free_len = 0; #ifdef FEAT_PROFILE profinfo_T profile_info; #endif @@ -2333,6 +2335,7 @@ call_user_func( if (isdefault) { char_u *default_expr = NULL; + def_rettv.v_type = VAR_NUMBER; def_rettv.vval.v_number = -1; @@ -2374,6 +2377,10 @@ call_user_func( v->di_tv = isdefault ? def_rettv : argvars[i]; v->di_tv.v_lock = VAR_FIXED; + if (isdefault) + // Need to free this later, no matter where it's stored. + tv_to_free[tv_to_free_len++] = &v->di_tv; + if (addlocal) { // Named arguments should be accessed without the "a:" prefix in @@ -2563,6 +2570,8 @@ call_user_func( did_emsg |= save_did_emsg; funcdepth_decrement(); + for (i = 0; i < tv_to_free_len; ++i) + clear_tv(tv_to_free[i]); cleanup_function_call(fc); } |