]> granicus.if.org Git - vim/commitdiff
patch 8.2.1789: Vim9: crash with invalid list constant v8.2.1789
authorBram Moolenaar <Bram@vim.org>
Sat, 3 Oct 2020 11:41:53 +0000 (13:41 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 3 Oct 2020 11:41:53 +0000 (13:41 +0200)
Problem:    Vim9: crash with invalid list constant. (Dhiraj Mishra)
Solution:   Return FAIL when compiling the list fails. (closes #7066)

src/errors.h
src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c

index bc6258cafb50e7080ffefa54ed8ff71312561f4c..cddd6910fe3e7f16a05acad22e8a359ff7a3ed19 100644 (file)
@@ -276,4 +276,6 @@ EXTERN char e_final_requires_a_value[]
        INIT(= N_("E1125: Final requires a value"));
 EXTERN char e_cannot_use_let_in_vim9_script[]
        INIT(= N_("E1126: Cannot use :let in Vim9 script"));
+EXTERN char e_missing_name_after_dot[]
+       INIT(= N_("E1127: Missing name after dot"));
 #endif
index 0a0bcb41ae6e097511311df91a9ada2e2c308a8c..fa33089e841e9a0f52f3d482b52aa7a91ba5164b 100644 (file)
@@ -1538,6 +1538,16 @@ def Test_expr7_list()
   CheckDefExecFailure(["var l: list<number> = ['x', 234]"], 'E1012:', 1)
   CheckDefExecFailure(["var l: list<string> = [234, 'x']"], 'E1012:', 1)
   CheckDefExecFailure(["var l: list<string> = ['x', 123]"], 'E1012:', 1)
+
+  var lines =<< trim END
+      vim9script
+      var datalist: list<string>
+      def Main()
+        datalist += ['x'.
+      enddef
+      Main()
+  END
+  CheckScriptFailure(lines, 'E1127:')
 enddef
 
 def Test_expr7_list_vim9script()
index ff1a97a3d88d3a976d75b5288c2a2f664ec49350..4280ac56284c7f7e2affdc836f926381235700f1 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1789,
 /**/
     1788,
 /**/
index 830e8bb9b6ae5ee5a9c790e22facef73235913c8..32def6c7962cb0604119e475dcb57081ee000fad 100644 (file)
@@ -2549,7 +2549,7 @@ compile_list(char_u **arg, cctx_T *cctx)
            break;
        }
        if (compile_expr0(&p, cctx) == FAIL)
-           break;
+           return FAIL;
        ++count;
        if (*p == ',')
        {
@@ -3333,7 +3333,10 @@ compile_subscript(
 
            *arg = p + 1;
            if (may_get_next_line(*arg, arg, cctx) == FAIL)
+           {
+               emsg(_(e_missing_name_after_dot));
                return FAIL;
+           }
            // dictionary member: dict.name
            p = *arg;
            if (eval_isdictc(*p))