vim-patch:8.2.1945: crash when passing NULL function to reduce()

Problem:    Crash when passing NULL function to reduce().
Solution:   Check for NULL pointer and give an error. (Dominique Pellé,
            closes vim/vim#7243)

0d90e728fe

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2023-04-16 08:58:37 +08:00
parent 6adfd24a06
commit d13222649a
2 changed files with 9 additions and 2 deletions

View File

@@ -150,6 +150,8 @@ static const char *e_invalwindow = N_("E957: Invalid window number");
static const char *e_reduceempty = N_("E998: Reduce of an empty %s with no initial value"); static const char *e_reduceempty = N_("E998: Reduce of an empty %s with no initial value");
static const char e_using_number_as_bool_nr[] static const char e_using_number_as_bool_nr[]
= N_("E1023: Using a Number as a Bool: %d"); = N_("E1023: Using a Number as a Bool: %d");
static const char e_missing_function_argument[]
= N_("E1132: Missing function argument");
/// Dummy va_list for passing to vim_snprintf /// Dummy va_list for passing to vim_snprintf
/// ///
@@ -6244,8 +6246,9 @@ static void f_reduce(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
} else { } else {
func_name = tv_get_string(&argvars[1]); func_name = tv_get_string(&argvars[1]);
} }
if (*func_name == NUL) { if (func_name == NULL || *func_name == NUL) {
return; // type error or empty name emsg(_(e_missing_function_argument));
return;
} }
funcexe_T funcexe = FUNCEXE_INIT; funcexe_T funcexe = FUNCEXE_INIT;

View File

@@ -747,6 +747,10 @@ func Test_reduce()
call assert_equal(42, reduce(v:_null_list, function('add'), 42)) call assert_equal(42, reduce(v:_null_list, function('add'), 42))
call assert_equal(42, reduce(v:_null_blob, function('add'), 42)) call assert_equal(42, reduce(v:_null_blob, function('add'), 42))
" should not crash
" Nvim doesn't have null functions
" call assert_fails('echo reduce([1], test_null_function())', 'E1132:')
endfunc endfunc
" splitting a string to a List using split() " splitting a string to a List using split()