]> granicus.if.org Git - vim/commitdiff
patch 8.2.2703: Vim9: memory leak when failing on locked variable v8.2.2703
authorBram Moolenaar <Bram@vim.org>
Sat, 3 Apr 2021 17:32:44 +0000 (19:32 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 3 Apr 2021 17:32:44 +0000 (19:32 +0200)
Problem:    Vim9: memory leak when failing on locked variable.
Solution:   Free the memory.

src/testdir/test_vim9_assign.vim
src/version.c
src/vim9execute.c

index 867afaf7159ac0d950b30ce0e5055ebadea95037..0b1d5fcb16696750159ac2a0a63f1e95ff5cb357 100644 (file)
@@ -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
index 5a5f73fb9c9f2d764b2b0c07e2a8cf75362353a7..812b1e587d9bc0aa773c8c37b8f35e7ba7a31bd6 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2703,
 /**/
     2702,
 /**/
index 81041bbeae137a09c8fbcb5b9683796c21654d34..6e011ba2fe7710c147a0175443edee4183035b5b 100644 (file)
@@ -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);