]> granicus.if.org Git - vim/commitdiff
patch 8.2.2764: memory leak when default function argument is allocated v8.2.2764
authorBram Moolenaar <Bram@vim.org>
Wed, 14 Apr 2021 15:06:43 +0000 (17:06 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 14 Apr 2021 15:06:43 +0000 (17:06 +0200)
Problem:    Memory leak when default function argument is allocated.
Solution:   Free the expression result.

src/testdir/test_functions.vim
src/userfunc.c
src/version.c

index 8ee36794a4a19d0fd8166e19491725ed3367dbe4..1cce8a0b19a45bacf573b5e84a17cb7819dae855 100644 (file)
@@ -1497,6 +1497,7 @@ endfunc
 
 func Test_balloon_show()
   CheckFeature balloon_eval
+
   " This won't do anything but must not crash either.
   call balloon_show('hi!')
   if !has('gui_running')
@@ -2650,4 +2651,12 @@ func Test_browsedir()
   call assert_fails('call browsedir("open", [])', 'E730:')
 endfunc
 
+func HasDefault(msg = 'msg')
+  return a:msg
+endfunc
+
+func Test_default_arg_value()
+  call assert_equal('msg', HasDefault())
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 772d45d12631f25bb7552412c5e6daeb0f6dd78a..99d4e0334edff578d6587f43ed8acfcca674ed12 100644 (file)
@@ -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);
 }
 
index 3dee026c1dd1c62328f7a99c3b8bc559e005dcf2..6ad07f7d76fb6028d406adbe55ea2eb9ade67f46 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2764,
 /**/
     2763,
 /**/