]> granicus.if.org Git - vim/commitdiff
patch 9.0.1317: crash when using an unset object variable v9.0.1317
authorBram Moolenaar <Bram@vim.org>
Fri, 17 Feb 2023 21:08:50 +0000 (21:08 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 17 Feb 2023 21:08:50 +0000 (21:08 +0000)
Problem:    Crash when using an unset object variable.
Solution:   Give an error instead. (closes #12005)

src/errors.h
src/testdir/test_vim9_class.vim
src/version.c
src/vim9class.c

index 336c187d6d04ca9d3c6ace2e763c6e0f092624d0..0bfafac1f16d452d4834dfd776dff3b8aa9b0efc 100644 (file)
@@ -1182,6 +1182,8 @@ EXTERN char e_invalid_command[]
        INIT(= N_("E476: Invalid command"));
 EXTERN char e_invalid_command_str[]
        INIT(= N_("E476: Invalid command: %s"));
+EXTERN char e_invalid_command_str_expected_str[]
+       INIT(= N_("E476: Invalid command: %s, expected %s"));
 EXTERN char e_no_bang_allowed[]
        INIT(= N_("E477: No ! allowed"));
 EXTERN char e_dont_panic[]
@@ -3442,6 +3444,6 @@ EXTERN char e_using_super_not_in_child_class[]
        INIT(= N_("E1358: Using \"super\" not in a child class"));
 EXTERN char e_cannot_define_new_function_in_abstract_class[]
        INIT(= N_("E1359: Cannot define a \"new\" function in an abstract class"));
-EXTERN char e_invalid_command_str_expected_str[]
-       INIT(= N_("E476: Invalid command: %s, expected %s"));
+EXTERN char e_using_null_object[]
+       INIT(= N_("E1360: Using a null object"));
 #endif
index be9b18e3a9bb3094605844946a126654238e7a62..f1aadde5d339970ef76b3c5ad38f8044745a3e6a 100644 (file)
@@ -182,6 +182,21 @@ def Test_class_interface_wrong_end()
   v9.CheckScriptFailure(lines, 'E476: Invalid command: endclass, expected endinterface')
 enddef
 
+def Test_object_not_set()
+  var lines =<< trim END
+      vim9script
+
+      class State
+        this.value = 'xyz'
+      endclass
+
+      var state: State 
+      var db = {'xyz': 789}
+      echo db[state.value]
+  END
+  v9.CheckScriptFailure(lines, 'E1360:')
+enddef
+
 def Test_class_member_initializer()
   var lines =<< trim END
       vim9script
index 6cd2f16851008026a8b562753ba45261dcd98de2..ff0b29ea15496cafa3fe6bc1ea68f3ed61d51522 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1317,
 /**/
     1316,
 /**/
index ecf5de7118312e02f9650a66eaca3d7c61f8a8b6..e11324d9c25cd531fe8f6e56a02c0d05f44f5f64 100644 (file)
@@ -1234,9 +1234,6 @@ class_object_index(
     evalarg_T  *evalarg,
     int                verbose UNUSED) // give error messages
 {
-    // int             evaluate = evalarg != NULL
-    //                               && (evalarg->eval_flags & EVAL_EVALUATE);
-
     if (VIM_ISWHITE((*arg)[1]))
     {
        semsg(_(e_no_white_space_allowed_after_str_str), ".", *arg);
@@ -1250,8 +1247,19 @@ class_object_index(
        return FAIL;
     size_t len = name_end - name;
 
-    class_T *cl = rettv->v_type == VAR_CLASS ? rettv->vval.v_class
-                                            : rettv->vval.v_object->obj_class;
+    class_T *cl;
+    if (rettv->v_type == VAR_CLASS)
+       cl = rettv->vval.v_class;
+    else // VAR_OBJECT
+    {
+       if (rettv->vval.v_object == NULL)
+       {
+           emsg(_(e_using_null_object));
+           return FAIL;
+       }
+       cl = rettv->vval.v_object->obj_class;
+    }
+
     if (*name_end == '(')
     {
        int on_class = rettv->v_type == VAR_CLASS;