]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1091: assignment to non-existing member causes a crash v9.0.1091
authorBram Moolenaar <Bram@vim.org>
Fri, 23 Dec 2022 17:56:27 +0000 (17:56 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 23 Dec 2022 17:56:27 +0000 (17:56 +0000)
Problem:    Assignment to non-existing member causes a crash. (Yegappan
            Lakshmanan)
Solution:   Give an error message and bail out when a member cannot be found.

src/testdir/test_vim9_class.vim
src/version.c
src/vim9class.c
src/vim9compile.c

index f45e3fa6c8cde887129f3278eb2c069b47ab0bea..88128e7454903bb556531c18ec262a47f4451748 100644 (file)
@@ -108,6 +108,17 @@ def Test_class_basic()
   END
   v9.CheckScriptFailure(lines, 'E1022:')
 
+  lines =<< trim END
+      vim9script
+      class Something
+        def new()
+          this.state = 0
+        enddef
+      endclass
+      var obj = Something.new()
+  END
+  v9.CheckScriptFailure(lines, 'E1089:')
+
   lines =<< trim END
       vim9script
       class Something
@@ -330,7 +341,9 @@ def Test_class_member_access()
       assert_equal(0, TextPos.counter)
       TextPos.AddToCounter(3)
       assert_equal(3, TextPos.counter)
+      assert_fails('echo TextPos.noSuchMember', 'E1338:')
 
+      assert_fails('TextPos.noSuchMember = 2', 'E1337:')
       assert_fails('TextPos.counter += 5', 'E1335')
   END
   v9.CheckScriptSuccess(lines)
index d07e657c00d0560a94469fc1e1e81d75694b0552..5679588336857f9ea5b11296f301abd167528a93 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1091,
 /**/
     1090,
 /**/
index 94fe9e227c207be5e840c4c5ec99f3eded84a086..2e1cac0c441eecdcffbb65eb74852c3ad66eca45 100644 (file)
@@ -569,8 +569,9 @@ cleanup:
 }
 
 /*
- * Find member "name" in class "cl" and return its type.
- * When not found t_any is returned.
+ * Find member "name" in class "cl", set "member_idx" to the member index and
+ * return its type.
+ * When not found "member_idx" is set to -1 and t_any is returned.
  */
     type_T *
 class_member_type(
@@ -591,6 +592,8 @@ class_member_type(
            return m->ocm_type;
        }
     }
+
+    semsg(_(e_unknown_variable_str), name);
     return &t_any;
 }
 
index 44403ece292b5270147382db6a036c07287e69b6..9105dcfaa3c147ef590a2513b26a6e0cadb3ad04 100644 (file)
@@ -1823,6 +1823,8 @@ compile_lhs(
            class_T *cl = (class_T *)lhs->lhs_type->tt_member;
            lhs->lhs_member_type = class_member_type(cl, after + 1,
                                           lhs->lhs_end, &lhs->lhs_member_idx);
+           if (lhs->lhs_member_idx < 0)
+               return FAIL;
        }
        else
            lhs->lhs_member_type = lhs->lhs_type->tt_member;