# HG changeset patch # User Bram Moolenaar # Date 1617471903 -7200 # Node ID 52a0e187264bbc5fcf618ec90611286e53d4345f # Parent 95ee4d33e4917f6e49f587580c3bbdafd3bb4b79 patch 8.2.2703: Vim9: memory leak when failing on locked variable Commit: https://github.com/vim/vim/commit/6e50ec2f0af85940e40ed3f897bfcfa445adbb0e Author: Bram Moolenaar 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. diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim --- 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 --- 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 --- 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);