Mercurial > vim
changeset 24878:f67773e26cfa v8.2.2977
patch 8.2.2977: crash when using a null function reference
Commit: https://github.com/vim/vim/commit/22db0d549f64aa3d8a6e366b70eb8d7e66933b82
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 12 Jun 2021 12:30:04 +0200 |
parents | efbb82e09bcb |
children | 042b0f754015 |
files | src/errors.h src/eval.c src/testdir/test_functions.vim src/version.c |
diffstat | 4 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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"));
--- 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)
--- 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()