changeset 22482:a1b3804163ca v8.2.1789

patch 8.2.1789: Vim9: crash with invalid list constant Commit: https://github.com/vim/vim/commit/c1f0066b642fb62e37b300033223ff3ee4aafcd6 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Oct 3 13:41:53 2020 +0200 patch 8.2.1789: Vim9: crash with invalid list constant Problem: Vim9: crash with invalid list constant. (Dhiraj Mishra) Solution: Return FAIL when compiling the list fails. (closes https://github.com/vim/vim/issues/7066)
author Bram Moolenaar <Bram@vim.org>
date Sat, 03 Oct 2020 13:45:03 +0200
parents 4ca8652b5b4b
children 9bbe172e1c44
files src/errors.h src/testdir/test_vim9_expr.vim src/version.c src/vim9compile.c
diffstat 4 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/errors.h
+++ b/src/errors.h
@@ -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
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -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()
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1789,
+/**/
     1788,
 /**/
     1787,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -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))