diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-04-03 19:32:44 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-04-03 19:32:44 +0200 |
commit | 6e50ec2f0af85940e40ed3f897bfcfa445adbb0e (patch) | |
tree | aa5f2683823ba14f52c0ec31fdf9e5c2e66523a6 | |
parent | c17ba791a9edfa12926ce29f1eef39044bee5ab7 (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.vim | 3 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 6 |
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); |