0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.4309: Vim9: crash when using a partial in the wrong context

Problem:    Vim9: crash when using a partial in the wrong context.
Solution:   Don't use an NULL outer pointer. (closes #9706)
This commit is contained in:
Bram Moolenaar
2022-02-06 13:55:03 +00:00
parent 8164f6ea3c
commit fe1bfc9b26
3 changed files with 40 additions and 5 deletions

View File

@@ -3125,6 +3125,35 @@ def Test_partial_call()
v9.CheckScriptFailure(lines, 'E1235:')
enddef
" Using "idx" from a legacy global function does not work.
" This caused a crash when called from legacy context.
func Test_partial_call_fails()
let lines =<< trim END
vim9script
var l = ['a', 'b', 'c']
def Iter(container: any): any
var idx = -1
var obj = {state: container}
def g:__NextItem__(self: dict<any>): any
++idx
return self.state[idx]
enddef
obj.__next__ = function('g:__NextItem__', [obj])
return obj
enddef
var it = Iter(l)
echo it.__next__()
END
call writefile(lines, 'XpartialCall')
try
source XpartialCall
catch /E1248:/
endtry
call delete('XpartialCall')
endfunc
def Test_cmd_modifier()
tab echo '0'
v9.CheckDefFailure(['5tab echo 3'], 'E16:')

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4309,
/**/
4308,
/**/

View File

@@ -1694,7 +1694,7 @@ handle_debug(isn_T *iptr, ectx_T *ectx)
}
/*
* Store a value in a list or dict variable.
* Store a value in a list, dict or blob variable.
* Returns OK, FAIL or NOTDONE (uncatchable error).
*/
static int
@@ -5081,12 +5081,16 @@ call_def_function(
goto failed_early;
if (partial != NULL)
{
if (partial->pt_outer.out_stack == NULL && current_ectx != NULL)
if (partial->pt_outer.out_stack == NULL)
{
if (current_ectx->ec_outer_ref != NULL
&& current_ectx->ec_outer_ref->or_outer != NULL)
ectx.ec_outer_ref->or_outer =
if (current_ectx != NULL)
{
if (current_ectx->ec_outer_ref != NULL
&& current_ectx->ec_outer_ref->or_outer != NULL)
ectx.ec_outer_ref->or_outer =
current_ectx->ec_outer_ref->or_outer;
}
// Should there be an error here?
}
else
{