changeset 31746:d3d3ed2c09f6 v9.0.1205

patch 9.0.1205: crash when handling class that extends another class Commit: https://github.com/vim/vim/commit/ae3205aa55741152b0143dbd7d637b35f576793e Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 15 20:49:00 2023 +0000 patch 9.0.1205: crash when handling class that extends another class Problem: Crash when handling class that extends another class with more than one object members. Solution: Correct pointer computations. (closes #11824)
author Bram Moolenaar <Bram@vim.org>
date Sun, 15 Jan 2023 22:00:03 +0100
parents ded74e298639
children f1f2cc4c50bc
files src/testdir/test_vim9_class.vim src/version.c src/vim9class.c
diffstat 3 files changed, 27 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -1081,6 +1081,26 @@ def Test_class_extends()
       var c = Child.new()
   END
   v9.CheckScriptFailure(lines, 'E1325: Method not found on class "Child": new(')
+
+  # base class with more than one object member
+  lines =<< trim END
+      vim9script
+
+      class Result
+        this.success: bool
+        this.value: any = null
+      endclass
+
+      class Success extends Result
+        def new(this.value = v:none)
+          this.success = true
+        enddef
+      endclass
+
+      var v = Success.new('asdf')
+      assert_equal("object of Success {success: true, value: 'asdf'}", string(v))
+  END
+  v9.CheckScriptSuccess(lines)
 enddef
 
 def Test_class_import()
--- 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 */
 /**/
+    1205,
+/**/
     1204,
 /**/
     1203,
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -182,10 +182,11 @@ add_members_to_class(
     for (int i = 0; i < parent_count; ++i)
     {
 	// parent members need to be copied
-	*members[i] = parent_members[i];
-	members[i]->ocm_name = vim_strsave(members[i]->ocm_name);
-	if (members[i]->ocm_init != NULL)
-	    members[i]->ocm_init = vim_strsave(members[i]->ocm_init);
+	ocmember_T	*m = *members + i;
+	*m = parent_members[i];
+	m->ocm_name = vim_strsave(m->ocm_name);
+	if (m->ocm_init != NULL)
+	    m->ocm_init = vim_strsave(m->ocm_init);
     }
     if (gap->ga_len > 0)
 	// new members are moved