From 22db0d549f64aa3d8a6e366b70eb8d7e66933b82 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 12 Jun 2021 12:16:55 +0200 Subject: [PATCH] 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 #8367) --- src/errors.h | 2 ++ src/eval.c | 8 ++++++++ src/testdir/test_functions.vim | 4 +++- src/version.c | 2 ++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/errors.h b/src/errors.h index fac3e26d8..63e2659f7 100644 --- a/src/errors.h +++ b/src/errors.h @@ -425,3 +425,5 @@ EXTERN char e_nr_arguments_too_few[] INIT(= N_("E1190: %d arguments too few")); EXTERN char e_call_to_function_that_failed_to_compile_str[] INIT(= N_("E1191: Call to function that failed to compile: %s")); +EXTERN char e_empty_function_name[] + INIT(= N_("E1192: Empty function name")); diff --git a/src/eval.c b/src/eval.c index b6bee5af5..0d15a70e2 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3772,7 +3772,14 @@ call_func_rettv( s = partial_name(pt); } else + { s = functv.vval.v_string; + if (s == NULL || *s == NUL) + { + emsg(_(e_empty_function_name)); + goto theend; + } + } } else s = (char_u *)""; @@ -3786,6 +3793,7 @@ call_func_rettv( funcexe.basetv = basetv; ret = get_func_tv(s, -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/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 130955439..d63bec498 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -2174,9 +2174,11 @@ 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. call call(test_null_function(), []) call call(test_null_partial(), []) + call assert_fails('call test_null_function()()', 'E1192:') + call assert_fails('call test_null_partial()()', 'E117:') endfunc func Test_char2nr() diff --git a/src/version.c b/src/version.c index 08f06cf4d..19a159d7e 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2977, /**/ 2976, /**/ -- 2.40.0