Skip to content

Commit

Permalink
patch 8.2.3923: Vim9: double free with split argument list in nested …
Browse files Browse the repository at this point in the history
…function

Problem:    Vim9: double free if a nested function has a line break in the
            argument list.
Solution:   Set cmdlinep when freeing the previous line.
  • Loading branch information
brammool committed Dec 28, 2021
1 parent 8bb3fe4 commit 4bf1006
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
20 changes: 19 additions & 1 deletion src/testdir/test_vim9_func.vim
Expand Up @@ -1669,7 +1669,7 @@ def Test_error_in_nested_function()
assert_fails('FuncWithForwardCall()', 'E1096:', '', 1, 'FuncWithForwardCall')
enddef

def Test_nested_functin_with_nextcmd()
def Test_nested_function_with_nextcmd()
var lines =<< trim END
vim9script
# Define an outer function
Expand All @@ -1689,6 +1689,24 @@ def Test_nested_functin_with_nextcmd()
CheckScriptFailure(lines, 'E476: Invalid command: AAAAA')
enddef

def Test_nested_function_with_args_split()
var lines =<< trim END
vim9script
def FirstFunction()
def SecondFunction(
)
# had a double free if the right parenthesis of the nested function is
# on the next line

enddef|BBBB
enddef
# Compile all functions
defcompile
END
# FIXME: this should fail on the BBBB
CheckScriptSuccess(lines)
enddef

def Test_return_type_wrong()
CheckScriptFailure([
'def Func(): number',
Expand Down
2 changes: 2 additions & 0 deletions src/userfunc.c
Expand Up @@ -219,6 +219,8 @@ get_function_args(
if (theline == NULL)
break;
vim_free(*line_to_free);
if (*eap->cmdlinep == *line_to_free)
*eap->cmdlinep = theline;
*line_to_free = theline;
whitep = (char_u *)" ";
p = skipwhite(theline);
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -749,6 +749,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3923,
/**/
3922,
/**/
Expand Down

0 comments on commit 4bf1006

Please sign in to comment.