patch 8.2.2703: Vim9: memory leak when failing on locked variable
Problem: Vim9: memory leak when failing on locked variable.
Solution: Free the memory.
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 867afaf..0b1d5fc 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1323,6 +1323,7 @@
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 @@
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 5a5f73f..812b1e5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
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 81041bb..6e011ba 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1944,7 +1944,10 @@
{
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 @@
// 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);