# HG changeset patch # User Bram Moolenaar # Date 1624739404 -7200 # Node ID a9a21631c090e2021e848610c452e52fa5477617 # Parent fc81b4530f925cc67404b95a4d23504e127aeea9 patch 8.2.3059: Vim9: memory leak when using lambda Commit: https://github.com/vim/vim/commit/e3ffaa6b7c2d53ab53da933ec91382d003cf9a12 Author: Bram Moolenaar Date: Sat Jun 26 22:17:35 2021 +0200 patch 8.2.3059: Vim9: memory leak when using lambda Problem: Vim9: memory leak when using lambda. Solution: Do not store the default value strings when skipping. diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -198,7 +198,7 @@ get_function_args( ga_init2(newargs, (int)sizeof(char_u *), 3); if (argtypes != NULL) ga_init2(argtypes, (int)sizeof(char_u *), 3); - if (default_args != NULL) + if (!skip && default_args != NULL) ga_init2(default_args, (int)sizeof(char_u *), 3); if (varargs != NULL) @@ -289,24 +289,27 @@ get_function_args( expr = p; if (eval1(&p, &rettv, NULL) != FAIL) { - if (ga_grow(default_args, 1) == FAIL) - goto err_ret; - - // trim trailing whitespace - while (p > expr && VIM_ISWHITE(p[-1])) - p--; - c = *p; - *p = NUL; - expr = vim_strsave(expr); - if (expr == NULL) + if (!skip) { + if (ga_grow(default_args, 1) == FAIL) + goto err_ret; + + // trim trailing whitespace + while (p > expr && VIM_ISWHITE(p[-1])) + p--; + c = *p; + *p = NUL; + expr = vim_strsave(expr); + if (expr == NULL) + { + *p = c; + goto err_ret; + } + ((char_u **)(default_args->ga_data)) + [default_args->ga_len] = expr; + default_args->ga_len++; *p = c; - goto err_ret; } - ((char_u **)(default_args->ga_data)) - [default_args->ga_len] = expr; - default_args->ga_len++; - *p = c; } else mustend = TRUE; @@ -357,7 +360,7 @@ get_function_args( err_ret: if (newargs != NULL) ga_clear_strings(newargs); - if (default_args != NULL) + if (!skip && default_args != NULL) ga_clear_strings(default_args); return FAIL; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3059, +/**/ 3058, /**/ 3057,