changeset 24325:52a0e187264b v8.2.2703

patch 8.2.2703: Vim9: memory leak when failing on locked variable Commit: https://github.com/vim/vim/commit/6e50ec2f0af85940e40ed3f897bfcfa445adbb0e Author: Bram Moolenaar <Bram@vim.org> Date: Sat Apr 3 19:32:44 2021 +0200 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.
author Bram Moolenaar <Bram@vim.org>
date Sat, 03 Apr 2021 19:45:03 +0200
parents 95ee4d33e491
children 7fb9981b8c4f
files src/testdir/test_vim9_assign.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 10 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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,
--- 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);