summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-04 21:54:07 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-04 21:54:07 +0100
commitbfe12043128d75585749f82aebbf4cdd1a7dfe31 (patch)
treeaa8748b5d2b9e4c51f65b5a210580b254a0d9d79 /src
parent26e117e9bcc09926d654b5993d61acde6b5749db (diff)
patch 8.2.0207: crash when missing member type on list argumentv8.2.0207
Problem: Crash when missing member type on list argument. Solution: Check for invalid type. (closes #5572)
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_script.vim5
-rw-r--r--src/userfunc.c23
-rw-r--r--src/version.c2
3 files changed, 26 insertions, 4 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index fee07083e6..dc1c0b973f 100644
--- 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
diff --git a/src/userfunc.c b/src/userfunc.c
index 2904ee986a..ef1d42d12b 100644
--- 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;
}
diff --git a/src/version.c b/src/version.c
index 1b8a0a83b3..be1bf33705 100644
--- 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,