# HG changeset patch # User Bram Moolenaar # Date 1623493804 -7200 # Node ID f67773e26cfa0e9b680c0a7ad004b60dee69cce0 # Parent efbb82e09bcbca326bba9610048dca0e3d57d9b0 patch 8.2.2977: crash when using a null function reference Commit: https://github.com/vim/vim/commit/22db0d549f64aa3d8a6e366b70eb8d7e66933b82 Author: Bram Moolenaar Date: Sat Jun 12 12:16:55 2021 +0200 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 https://github.com/vim/vim/issues/8367) diff --git a/src/errors.h b/src/errors.h --- 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 --- 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2977, +/**/ 2976, /**/ 2975,