From c7f7f6db3e9d3b6b723ed17d5244c83859583832 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 4 Nov 2020 13:38:28 +0100 Subject: [PATCH] patch 8.2.1952: Vim9: crash when using a NULL dict key Problem: Vim9: crash when using a NULL dict key. Solution: Use a NULL dict key like an empty string. (closes #7249) --- src/testdir/test_vim9_expr.vim | 2 ++ src/version.c | 2 ++ src/vim9execute.c | 9 ++++++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index 656718c49..2d741e495 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1902,6 +1902,8 @@ def Test_expr7_dict() var dictdict: dict> = #{one: #{a: 'text'}, two: #{}} dictdict = #{one: #{}, two: #{a: 'text'}} dictdict = #{one: #{}, two: #{}} + + assert_equal({'': 0}, {matchstr('string', 'wont match'): 0}) CheckDefFailure(["var x = #{a:8}"], 'E1069:', 1) CheckDefFailure(["var x = #{a : 8}"], 'E1068:', 1) diff --git a/src/version.c b/src/version.c index d677744ee..98a3ab153 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1952, /**/ 1951, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index 33027871a..eb0e1db63 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1738,6 +1738,7 @@ call_def_function( int count = iptr->isn_arg.number; dict_T *dict = dict_alloc(); dictitem_T *item; + char_u *key; if (dict == NULL) goto failed; @@ -1746,15 +1747,17 @@ call_def_function( // have already checked key type is VAR_STRING tv = STACK_TV_BOT(2 * (idx - count)); // check key is unique - item = dict_find(dict, tv->vval.v_string, -1); + key = tv->vval.v_string == NULL + ? (char_u *)"" : tv->vval.v_string; + item = dict_find(dict, key, -1); if (item != NULL) { SOURCING_LNUM = iptr->isn_lnum; - semsg(_(e_duplicate_key), tv->vval.v_string); + semsg(_(e_duplicate_key), key); dict_unref(dict); goto on_error; } - item = dictitem_alloc(tv->vval.v_string); + item = dictitem_alloc(key); clear_tv(tv); if (item == NULL) { -- 2.40.0