summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-06-17 19:23:34 +0100
committerBram Moolenaar <Bram@vim.org>2022-06-17 19:23:34 +0100
commit7d149f899d423b7bf2b90d7b11ebe3e560c462b9 (patch)
treef487ea09b662d52ab188bc40aa14e0f84a96a1eb
parent47f1a55849a73cefe738a246798221e45448546a (diff)
downloadvim-git-7d149f899d423b7bf2b90d7b11ebe3e560c462b9.tar.gz
patch 8.2.5117: crash when calling a Lua callback from a :def functionv8.2.5117
Problem: Crash when calling a Lua callback from a :def function. (Bohdan Makohin) Solution: Handle FC_CFUNC in call_user_func_check(). (closes #10587)
-rw-r--r--src/testdir/test_lua.vim11
-rw-r--r--src/userfunc.c17
-rw-r--r--src/version.c2
3 files changed, 22 insertions, 8 deletions
diff --git a/src/testdir/test_lua.vim b/src/testdir/test_lua.vim
index e45da6afc..7fcd13d7d 100644
--- a/src/testdir/test_lua.vim
+++ b/src/testdir/test_lua.vim
@@ -664,6 +664,17 @@ func Test_lua_blob()
\ '[string "vim chunk"]:1: string expected, got table')
endfunc
+def Vim9Test(Callback: func())
+ Callback()
+enddef
+
+func Test_call_lua_func_from_vim9_func()
+ " this only tests that Vim doesn't crash
+ lua << EOF
+vim.fn.Vim9Test(function () print('Hello') end)
+EOF
+endfunc
+
func Test_lua_funcref()
function I(x)
return a:x
diff --git a/src/userfunc.c b/src/userfunc.c
index cc477fed3..9b960b775 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -3021,6 +3021,15 @@ call_user_func_check(
{
int error;
+#ifdef FEAT_LUA
+ if (fp->uf_flags & FC_CFUNC)
+ {
+ cfunc_T cb = fp->uf_cb;
+
+ return (*cb)(argcount, argvars, rettv, fp->uf_cb_state);
+ }
+#endif
+
if (fp->uf_flags & FC_RANGE && funcexe->fe_doesrange != NULL)
*funcexe->fe_doesrange = TRUE;
error = check_user_func_argcount(fp, argcount);
@@ -3584,14 +3593,6 @@ call_func(
if (fp != NULL && (fp->uf_flags & FC_DELETED))
error = FCERR_DELETED;
-#ifdef FEAT_LUA
- else if (fp != NULL && (fp->uf_flags & FC_CFUNC))
- {
- cfunc_T cb = fp->uf_cb;
-
- error = (*cb)(argcount, argvars, rettv, fp->uf_cb_state);
- }
-#endif
else if (fp != NULL)
{
if (funcexe->fe_argv_func != NULL)
diff --git a/src/version.c b/src/version.c
index c842e19dd..1b6fd2893 100644
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 5117,
+/**/
5116,
/**/
5115,