aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/eval/typval.c5
-rw-r--r--test/functional/eval/null_spec.lua6
-rw-r--r--test/unit/eval/typval_spec.lua7
3 files changed, 17 insertions, 1 deletions
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c
index 326334f149..8d1ecf8f14 100644
--- a/src/nvim/eval/typval.c
+++ b/src/nvim/eval/typval.c
@@ -1167,8 +1167,11 @@ void tv_dict_unref(dict_T *const d)
/// @return found item or NULL if nothing was found.
dictitem_T *tv_dict_find(const dict_T *const d, const char *const key,
const ptrdiff_t len)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+ FUNC_ATTR_NONNULL_ARG(2) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
+ if (d == NULL) {
+ return NULL;
+ }
hashitem_T *const hi = (len < 0
? hash_find(&d->dv_hashtab, (const char_u *)key)
: hash_find_len(&d->dv_hashtab, key, (size_t)len));
diff --git a/test/functional/eval/null_spec.lua b/test/functional/eval/null_spec.lua
index f72d05f2a3..3b361ceeda 100644
--- a/test/functional/eval/null_spec.lua
+++ b/test/functional/eval/null_spec.lua
@@ -130,4 +130,10 @@ describe('NULL', function()
null_list_expr_test('is not not equal to itself', 'L != L', 0, 0)
null_list_expr_test('counts correctly', 'count([L], L)', 0, 1)
end)
+ describe('dict', function()
+ it('does not crash when indexing NULL dict', function()
+ eq('\nE716: Key not present in Dictionary: test\nE15: Invalid expression: v:_null_dict.test',
+ redir_exec('echo v:_null_dict.test'))
+ end)
+ end)
end)
diff --git a/test/unit/eval/typval_spec.lua b/test/unit/eval/typval_spec.lua
index ebd53469e8..937869a7bc 100644
--- a/test/unit/eval/typval_spec.lua
+++ b/test/unit/eval/typval_spec.lua
@@ -1568,5 +1568,12 @@ describe('typval.c', function()
end)
end)
end)
+ describe('indexing', function()
+ describe('find', function()
+ itp('works with NULL dict', function()
+ eq(nil, lib.tv_dict_find(nil, '', 0))
+ end)
+ end)
+ end)
end)
end)