Skip to content

Commit

Permalink
patch 9.0.2173: Vim9: crash when compiling for statement and non-exis…
Browse files Browse the repository at this point in the history
…ting type

Problem:  Vim9: Vim crashes when compiling a for statement with a
          non-existing type
Solution: Error out when  lhs_type is not null

closes: #13703

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
  • Loading branch information
yegappan authored and chrisbra committed Dec 16, 2023
1 parent a185a31 commit 062bb6b
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 0 deletions.
110 changes: 110 additions & 0 deletions src/testdir/test_vim9_script.vim
Original file line number Diff line number Diff line change
Expand Up @@ -2698,6 +2698,37 @@ def Test_for_loop_fails()
v9.CheckDefSuccess(lines)

v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')

# Test for too many for loops
lines =<< trim END
vim9script
def Foo()
for a in range(1)
for b in range(1)
for c in range(1)
for d in range(1)
for e in range(1)
for f in range(1)
for g in range(1)
for h in range(1)
for i in range(1)
for j in range(1)
for k in range(1)
endfor
endfor
endfor
endfor
endfor
endfor
endfor
endfor
endfor
endfor
endfor
enddef
defcompile
END
v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
enddef

def Test_for_loop_script_var()
Expand Down Expand Up @@ -4796,6 +4827,85 @@ def Test_defer_skipped()
v9.CheckSourceSuccess(lines)
enddef

" Test for using defer without parenthesis for the function name
def Test_defer_func_without_paren()
var lines =<< trim END
vim9script
def Foo()
defer Bar
enddef
defcompile
END
v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
enddef

" Test for using defer without parenthesis for the function name
def Test_defer_non_existing_func()
var lines =<< trim END
vim9script
def Foo()
defer Bar()
enddef
defcompile
END
v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
enddef

" Test for using defer with an invalid function name
def Test_defer_invalid_func()
var lines =<< trim END
vim9script
def Foo()
var Abc = 10
defer Abc()
enddef
defcompile
END
v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
enddef

" Test for using defer with an invalid argument to a function
def Test_defer_invalid_func_arg()
var lines =<< trim END
vim9script
def Bar(x: number)
enddef
def Foo()
defer Bar(a)
enddef
defcompile
END
v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
enddef

" Test for using an non-existing type in a "for" statement.
def Test_invalid_type_in_for()
var lines =<< trim END
vim9script
def Foo()
for b: x in range(10)
endfor
enddef
defcompile
END
v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x in range(10)', 1)
enddef

" Test for using a line break between the variable name and the type in a for
" statement.
def Test_for_stmt_space_before_type()
var lines =<< trim END
vim9script
def Foo()
for a
:number in range(10)
endfor
enddef
defcompile
END
v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
enddef

" Keep this last, it messes up highlighting.
def Test_substitute_cmd()
new
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2173,
/**/
2172,
/**/
Expand Down
2 changes: 2 additions & 0 deletions src/vim9cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -1088,6 +1088,8 @@ compile_for(char_u *arg_start, cctx_T *cctx)
}
p = skipwhite(p + 1);
lhs_type = parse_type(&p, cctx->ctx_type_list, TRUE);
if (lhs_type == NULL)
goto failed;
}

if (get_var_dest(name, &dest, CMD_for, &opt_flags,
Expand Down

0 comments on commit 062bb6b

Please sign in to comment.