From a5d3590505fc3e1deea990560d472baa563abed7 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Fri, 29 Apr 2022 21:15:02 +0100 Subject: [PATCH] patch 8.2.4847: crash when using uninitialized function pointer Problem: Crash when using uninitialized function pointer. Solution: Check for NULL pointer. (closes #10319, closes #10319) --- src/eval.c | 3 ++- src/testdir/test_vim9_script.vim | 32 ++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/eval.c b/src/eval.c index 61b09fb6b..e2980a283 100644 --- a/src/eval.c +++ b/src/eval.c @@ -5314,7 +5314,8 @@ echo_string_core( if (echo_style) { - r = make_ufunc_name_readable(tv->vval.v_string, + r = tv->vval.v_string == NULL ? (char_u *)"function()" + : make_ufunc_name_readable(tv->vval.v_string, buf, MAX_FUNC_NAME_LEN); if (r == buf) { diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index e108a2ca4..4a01daa39 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -4115,6 +4115,38 @@ def Run_Test_misplaced_type() delete('XTest_misplaced_type') enddef +" Ensure echo doesn't crash when stringifying empty variables. +def Test_echo_uninit_variables() + var res: string + + var var_bool: bool + var var_num: number + var var_float: float + var Var_func: func + var var_string: string + var var_blob: blob + var var_job: job + var var_channel: channel + var var_list: list + var var_dict: dict + + redir => res + echo var_bool + echo var_num + echo var_float + echo Var_func + echo var_string + echo var_blob + echo var_job + echo var_channel + echo var_list + echo var_dict + redir END + + assert_equal(['false', '0', '0.0', 'function()', '', '0z', 'no process', + 'channel fail', '[]', '{}'], res->split('\n')) +enddef + " Keep this last, it messes up highlighting. def Test_substitute_cmd() new diff --git a/src/version.c b/src/version.c index eddc6c96a..ee5a9ab02 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4847, /**/ 4846, /**/ -- 2.40.0