changeset 24014:e45b2e28e45e v8.2.2549

patch 8.2.2549: crash after using "g:" in a for loop Commit: https://github.com/vim/vim/commit/1bd3cb201983859d86d644eef9e98cd3e9de7261 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Feb 24 12:27:31 2021 +0100 patch 8.2.2549: crash after using "g:" in a for loop Problem: Crash after using "g:" in a for loop. Solution: Increment the reference count. (closes https://github.com/vim/vim/issues/7892)
author Bram Moolenaar <Bram@vim.org>
date Wed, 24 Feb 2021 12:30:03 +0100
parents a18e4d113a10
children 4bce4a16cb66
files src/testdir/test_vim9_expr.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 9 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -2545,6 +2545,12 @@ def Test_expr7_namespace()
   assert_equal('some', get(t:, 'some_var', 'xxx'))
   assert_equal('xxx', get(t:, 'no_var', 'xxx'))
   unlet t:some_var
+
+  # check using g: in a for loop more than DO_NOT_FREE_CNT times
+  for i in range(100000)
+    if has_key(g:, 'does-not-exist')
+    endif
+  endfor
 enddef
 
 def Test_expr7_parens()
--- 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 */
 /**/
+    2549,
+/**/
     2548,
 /**/
     2547,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1771,6 +1771,7 @@ call_def_function(
 		    tv->v_type = VAR_DICT;
 		    tv->v_lock = 0;
 		    tv->vval.v_dict = d;
+		    ++d->dv_refcount;
 		    ++ectx.ec_stack.ga_len;
 		}
 		break;