changeset 31525:f7c82a85e88a v9.0.1095

patch 9.0.1095: using freed memory when declaration fails Commit: https://github.com/vim/vim/commit/6ef5471afa69a654888bc285a51a6035405d33a0 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Dec 25 19:31:36 2022 +0000 patch 9.0.1095: using freed memory when declaration fails Problem: Using freed memory when declaration fails. (Yegappan Lakshmanan) Solution: After unreferencing an object set the reference to NULL.
author Bram Moolenaar <Bram@vim.org>
date Sun, 25 Dec 2022 20:45:04 +0100
parents 1996a311ac70
children 9759807cf1f3
files src/testdir/test_vim9_class.vim src/typval.c src/version.c
diffstat 3 files changed, 20 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -349,6 +349,22 @@ def Test_class_object_member_access()
       assert_equal('make = 123', c2.GetMake())
   END
   v9.CheckScriptSuccess(lines)
+
+  lines =<< trim END
+      vim9script
+
+      class MyCar
+        this.make: string
+
+        def new(make_arg: string)
+            this.make = make_arg
+        enddef
+      endclass
+
+      var c = MyCar.new("abc")
+      var c = MyCar.new("def")
+  END
+  v9.CheckScriptFailure(lines, 'E1041:')
 enddef
 
 def Test_class_member_access()
--- a/src/typval.c
+++ b/src/typval.c
@@ -162,9 +162,11 @@ clear_tv(typval_T *varp)
 		break;
 	    case VAR_CLASS:
 		class_unref(varp->vval.v_class);
+		varp->vval.v_class = NULL;
 		break;
 	    case VAR_OBJECT:
 		object_unref(varp->vval.v_object);
+		varp->vval.v_object = NULL;
 		break;
 	    case VAR_UNKNOWN:
 	    case VAR_ANY:
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1095,
+/**/
     1094,
 /**/
     1093,