From cb848b687f9b6ec7b1c3d903d3ff84fc1f52d8e3 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Mon, 20 Jan 2025 21:38:09 +0100 Subject: [PATCH] patch 9.1.1041: Vim9: out-of-bound access when echoing an enum Problem: Vim9: out-of-bound access when echoing an enum Solution: Add NUL to growarray, check that ufunc is non-null before accessing it to make Coverity happy (Yegappan Lakshmanan) closes: #16488 Signed-off-by: Yegappan Lakshmanan Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_enum.vim | 15 +++++++++++++++ src/version.c | 2 ++ src/vim9class.c | 1 + src/vim9expr.c | 2 +- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_vim9_enum.vim b/src/testdir/test_vim9_enum.vim index 74eb468805..de26259d49 100644 --- a/src/testdir/test_vim9_enum.vim +++ b/src/testdir/test_vim9_enum.vim @@ -1586,4 +1586,19 @@ def Test_lambda_block_in_enum() v9.CheckScriptSuccess(lines) enddef +" Echo an enum +def Test_enum_echo() + var lines =<< trim END + vim9script + enum Demo + one('tahi'), + two('rua'), + three('toru') + var alias: string + endenum + assert_equal('enum Demo.one {name: one, ordinal: 0, alias: tahi}', execute('echo Demo.one')->split("\n")[0]) + END + v9.CheckScriptSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 8e53159579..5b3683ddd8 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1041, /**/ 1040, /**/ diff --git a/src/vim9class.c b/src/vim9class.c index c3ccf0250a..e847bf0864 100644 --- a/src/vim9class.c +++ b/src/vim9class.c @@ -4054,6 +4054,7 @@ object2string( vim_free(ga.ga_data); return NULL; } + ga_append(&ga, NUL); return (char_u *)ga.ga_data; } diff --git a/src/vim9expr.c b/src/vim9expr.c index 7b8c96adbd..b76544869c 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -406,7 +406,7 @@ compile_class_object_index(cctx_T *cctx, char_u **arg, type_T *type) } } - if (is_super && IS_ABSTRACT_METHOD(ufunc)) + if (is_super && ufunc != NULL && IS_ABSTRACT_METHOD(ufunc)) { // Trying to invoke an abstract method in a super class is not // allowed.