diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-11-04 13:38:28 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-11-04 13:38:28 +0100 |
commit | c7f7f6db3e9d3b6b723ed17d5244c83859583832 (patch) | |
tree | 9d7ce08204af8a8199f9f29a79bb6564d5e26c36 | |
parent | 64ffa9b5fb34adb0b20fc22e8127604274bc3010 (diff) |
patch 8.2.1952: Vim9: crash when using a NULL dict keyv8.2.1952
Problem: Vim9: crash when using a NULL dict key.
Solution: Use a NULL dict key like an empty string. (closes #7249)
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 2 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | 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 656718c49c..2d741e495d 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<dict<string>> = #{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 d677744eed..98a3ab1530 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1952, +/**/ 1951, /**/ 1950, diff --git a/src/vim9execute.c b/src/vim9execute.c index 33027871a0..eb0e1db638 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) { |