diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-02-06 13:55:03 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-02-06 13:55:03 +0000 |
commit | fe1bfc9b267fffedac6b5224d7aa6cc5d9d15f64 (patch) | |
tree | 86ffe251685328147fe61283f2e1aba0c7eb0707 | |
parent | 8164f6ea3cd675d0c22b058d71df2454fa108a35 (diff) | |
download | vim-git-fe1bfc9b267fffedac6b5224d7aa6cc5d9d15f64.tar.gz |
patch 8.2.4309: Vim9: crash when using a partial in the wrong contextv8.2.4309
Problem: Vim9: crash when using a partial in the wrong context.
Solution: Don't use an NULL outer pointer. (closes #9706)
-rw-r--r-- | src/testdir/test_vim9_func.vim | 29 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 14 |
3 files changed, 40 insertions, 5 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 55297cb65..e781a21a1 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -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:') diff --git a/src/version.c b/src/version.c index 4c48d5f60..37d653d3a 100644 --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4309, +/**/ 4308, /**/ 4307, diff --git a/src/vim9execute.c b/src/vim9execute.c index cac8c519d..6c79ff7df 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -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 { |