changeset 19297:84703c85a583 v8.2.0207

patch 8.2.0207: crash when missing member type on list argument Commit: https://github.com/vim/vim/commit/bfe12043128d75585749f82aebbf4cdd1a7dfe31 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Feb 4 21:54:07 2020 +0100 patch 8.2.0207: crash when missing member type on list argument Problem: Crash when missing member type on list argument. Solution: Check for invalid type. (closes https://github.com/vim/vim/issues/5572)
author Bram Moolenaar <Bram@vim.org>
date Tue, 04 Feb 2020 22:00:05 +0100
parents 3142491db658
children 3b5c07c8e82b
files src/testdir/test_vim9_script.vim src/userfunc.c src/version.c
diffstat 3 files changed, 26 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -160,13 +160,16 @@ def Test_call_default_args()
 enddef
 
 def Test_return_type_wrong()
-  " TODO: why is ! needed for Mac and FreeBSD?
   CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
   CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
   CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
   CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
 enddef
 
+def Test_arg_type_wrong()
+  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
+enddef
+
 def Test_try_catch()
   let l = []
   try
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -2968,6 +2968,11 @@ ex_function(exarg_T *eap)
 
     if (eap->cmdidx == CMD_def)
     {
+	int lnum_save = SOURCING_LNUM;
+
+	// error messages are for the first function line
+	SOURCING_LNUM = sourcing_lnum_top;
+
 	// parse the argument types
 	ga_init2(&fp->uf_type_list, sizeof(type_T), 5);
 
@@ -2980,16 +2985,23 @@ ex_function(exarg_T *eap)
 	    fp->uf_arg_types = ALLOC_CLEAR_MULT(type_T *, len);
 	    if (fp->uf_arg_types != NULL)
 	    {
-		int i;
+		int	i;
+		type_T	*type;
 
 		for (i = 0; i < len; ++ i)
 		{
 		    p = ((char_u **)argtypes.ga_data)[i];
 		    if (p == NULL)
 			// todo: get type from default value
-			fp->uf_arg_types[i] = &t_any;
+			type = &t_any;
 		    else
-			fp->uf_arg_types[i] = parse_type(&p, &fp->uf_type_list);
+			type = parse_type(&p, &fp->uf_type_list);
+		    if (type == NULL)
+		    {
+			SOURCING_LNUM = lnum_save;
+			goto errret_2;
+		    }
+		    fp->uf_arg_types[i] = type;
 		}
 	    }
 	    if (varargs)
@@ -3005,6 +3017,11 @@ ex_function(exarg_T *eap)
 		    fp->uf_va_type = &t_any;
 		else
 		    fp->uf_va_type = parse_type(&p, &fp->uf_type_list);
+		if (fp->uf_va_type == NULL)
+		{
+		    SOURCING_LNUM = lnum_save;
+		    goto errret_2;
+		}
 	    }
 	    varargs = FALSE;
 	}
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    207,
+/**/
     206,
 /**/
     205,