summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-04-03 19:32:44 +0200
committerBram Moolenaar <Bram@vim.org>2021-04-03 19:32:44 +0200
commit6e50ec2f0af85940e40ed3f897bfcfa445adbb0e (patch)
treeaa5f2683823ba14f52c0ec31fdf9e5c2e66523a6
parentc17ba791a9edfa12926ce29f1eef39044bee5ab7 (diff)
patch 8.2.2703: Vim9: memory leak when failing on locked variablev8.2.2703
Problem: Vim9: memory leak when failing on locked variable. Solution: Free the memory.
-rw-r--r--src/testdir/test_vim9_assign.vim3
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c6
3 files changed, 10 insertions, 1 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 867afaf715..0b1d5fcb16 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1323,6 +1323,7 @@ def Test_var_declaration()
unlet g:var_test
unlet g:var_prefixed
unlet g:other_var
+ unlet g:globConst
unlet g:FOO
unlet g:FOOS
unlet g:FLIST
@@ -1375,7 +1376,7 @@ def Test_var_declaration_fails()
SetGlobalConst()
g:globConst = 234
END
- CheckScriptFailure(lines, 'E741: Value is locked: globConst', 1)
+ CheckScriptFailure(lines, 'E741: Value is locked: g:globConst', 6)
unlet g:globConst
lines =<< trim END
diff --git a/src/version.c b/src/version.c
index 5a5f73fb9c..812b1e587d 100644
--- 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 */
/**/
+ 2703,
+/**/
2702,
/**/
2701,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 81041bbeae..6e011ba2fe 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1944,7 +1944,10 @@ call_def_function(
{
SOURCING_LNUM = iptr->isn_lnum;
if (var_check_permission(di, name) == FAIL)
+ {
+ clear_tv(STACK_TV_BOT(0));
goto on_error;
+ }
clear_tv(&di->di_tv);
di->di_tv = *STACK_TV_BOT(0);
}
@@ -1966,7 +1969,10 @@ call_def_function(
// the value needs to be checked here.
SOURCING_LNUM = iptr->isn_lnum;
if (value_check_lock(sv->sv_tv->v_lock, sv->sv_name, FALSE))
+ {
+ clear_tv(STACK_TV_BOT(0));
goto on_error;
+ }
clear_tv(sv->sv_tv);
*sv->sv_tv = *STACK_TV_BOT(0);