summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-02-06 13:55:03 +0000
committerBram Moolenaar <Bram@vim.org>2022-02-06 13:55:03 +0000
commitfe1bfc9b267fffedac6b5224d7aa6cc5d9d15f64 (patch)
tree86ffe251685328147fe61283f2e1aba0c7eb0707
parent8164f6ea3cd675d0c22b058d71df2454fa108a35 (diff)
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.vim29
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c14
3 files changed, 40 insertions, 5 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 55297cb652..e781a21a14 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 4c48d5f60c..37d653d3a5 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 cac8c519d9..6c79ff7df3 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
{