aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-04-16 09:01:33 +0800
committerzeertzjq <zeertzjq@outlook.com>2023-04-16 10:15:15 +0800
commitf4d3e279e861dc37dd047c81a0807767a74d251b (patch)
tree96ebf30a32c73904ad4482e58dac2fb246cfb501
parent08121ef69f47f8ad8f8903a732920412e24d30c1 (diff)
downloadrneovim-f4d3e279e861dc37dd047c81a0807767a74d251b.tar.gz
rneovim-f4d3e279e861dc37dd047c81a0807767a74d251b.tar.bz2
rneovim-f4d3e279e861dc37dd047c81a0807767a74d251b.zip
vim-patch:8.2.2977: crash when using a null function reference
Problem: Crash when using a null function reference. (Naohiro Ono) Solution: Check for an invalid function name. (closes vim/vim#8367) https://github.com/vim/vim/commit/22db0d549f64aa3d8a6e366b70eb8d7e66933b82 Co-authored-by: Bram Moolenaar <Bram@vim.org>
-rw-r--r--runtime/doc/eval.txt2
-rw-r--r--src/nvim/eval.c6
-rw-r--r--test/old/testdir/test_functions.vim6
3 files changed, 12 insertions, 2 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 1ff6e3c360..ccb615602f 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -139,7 +139,7 @@ You will not get an error if you try to change the type of a variable.
1.2 Function references ~
- *Funcref* *E695* *E718*
+ *Funcref* *E695* *E718* *E1192*
A Funcref variable is obtained with the |function()| function, the |funcref()|
function or created with the lambda expression |expr-lambda|. It can be used
in an expression in the place of a function name, before the parenthesis
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 87633365b6..a5c81666c1 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -96,6 +96,7 @@ static const char *e_string_list_or_blob_required = N_("E1098: String, List or B
static const char e_expression_too_recursive_str[] = N_("E1169: Expression too recursive: %s");
static const char e_dot_can_only_be_used_on_dictionary_str[]
= N_("E1203: Dot can only be used on a dictionary: %s");
+static const char e_empty_function_name[] = N_("E1192: Empty function name");
static char * const namespace_char = "abglstvw";
@@ -3273,6 +3274,10 @@ static int call_func_rettv(char **const arg, evalarg_T *const evalarg, typval_T
funcname = is_lua ? lua_funcname : partial_name(pt);
} else {
funcname = functv.vval.v_string;
+ if (funcname == NULL || *funcname == NUL) {
+ emsg(_(e_empty_function_name));
+ goto theend;
+ }
}
} else {
funcname = "";
@@ -3288,6 +3293,7 @@ static int call_func_rettv(char **const arg, evalarg_T *const evalarg, typval_T
const int ret = get_func_tv(funcname, is_lua ? (int)(*arg - funcname) : -1, rettv,
arg, evalarg, &funcexe);
+theend:
// Clear the funcref afterwards, so that deleting it while
// evaluating the arguments is possible (see test55).
if (evaluate) {
diff --git a/test/old/testdir/test_functions.vim b/test/old/testdir/test_functions.vim
index 3144af83d7..abea3b2538 100644
--- a/test/old/testdir/test_functions.vim
+++ b/test/old/testdir/test_functions.vim
@@ -2010,11 +2010,15 @@ func Test_call()
call assert_fails("call call('Mylen', [], 0)", 'E715:')
call assert_fails('call foo', 'E107:')
- " This once caused a crash.
+ " These once caused a crash.
" Nvim doesn't have null functions
" call call(test_null_function(), [])
" Nvim doesn't have null partials
" call call(test_null_partial(), [])
+ " Nvim doesn't have null functions
+ " call assert_fails('call test_null_function()()', 'E1192:')
+ " Nvim doesn't have null partials
+ " call assert_fails('call test_null_partial()()', 'E117:')
endfunc
func Test_char2nr()