diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2022-08-14 12:07:11 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-08-14 12:07:11 +0100 |
commit | 63acae13f57c5ad4c8ec3146d0c458550b9e984e (patch) | |
tree | 50a6a623dcce89ae1f639c4c2e2f62904aee8840 | |
parent | c9b6570fab46bf2c246a954cfb8c0d95fe2746b3 (diff) |
patch 9.0.0204: indexof() may leak memoryv9.0.0204
Problem: indexof() may leak memory.
Solution: Free allocated values. (Yegappan Lakshmanan, closes #10916)
-rw-r--r-- | src/evalfunc.c | 7 | ||||
-rw-r--r-- | src/testdir/test_blob.vim | 1 | ||||
-rw-r--r-- | src/testdir/test_listdict.vim | 6 | ||||
-rw-r--r-- | src/testdir/test_vim9_builtin.vim | 30 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 43 insertions, 3 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index 4f68845a16..3817352ca3 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -6814,6 +6814,7 @@ indexof_eval_expr(typval_T *expr) return FALSE; found = tv_get_bool_chk(&newtv, &error); + clear_tv(&newtv); return error ? FALSE : found; } @@ -6864,6 +6865,7 @@ indexof_list(list_T *l, long startidx, typval_T *expr) { listitem_T *item; long idx = 0; + int found; if (l == NULL) return -1; @@ -6888,7 +6890,10 @@ indexof_list(list_T *l, long startidx, typval_T *expr) set_vim_var_nr(VV_KEY, idx); copy_tv(&item->li_tv, get_vim_var_tv(VV_VAL)); - if (indexof_eval_expr(expr)) + found = indexof_eval_expr(expr); + clear_tv(get_vim_var_tv(VV_VAL)); + + if (found) return idx; } diff --git a/src/testdir/test_blob.vim b/src/testdir/test_blob.vim index 46f2d61ad3..46370c4749 100644 --- a/src/testdir/test_blob.vim +++ b/src/testdir/test_blob.vim @@ -772,6 +772,7 @@ func Test_indexof() call assert_equal(-1, indexof(b, {i, v -> v == 0x1})) call assert_equal(1, indexof(b, "v:val == 0xad")) call assert_equal(-1, indexof(b, "v:val == 0xff")) + call assert_equal(-1, indexof(b, {_, v -> "v == 0xad"})) call assert_equal(-1, indexof(0z, "v:val == 0x0")) call assert_equal(-1, indexof(test_null_blob(), "v:val == 0xde")) diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim index 2c4e5c722d..bba4e3e1e1 100644 --- a/src/testdir/test_listdict.vim +++ b/src/testdir/test_listdict.vim @@ -1462,7 +1462,13 @@ func Test_indexof() call assert_equal(-1, indexof(l, "v:val.n == 10", #{startidx: -4})) call assert_equal(0, indexof(l, "v:val.n == 10", test_null_dict())) + let s = ["a", "b", "c"] + call assert_equal(2, indexof(s, {_, v -> v == 'c'})) + call assert_equal(-1, indexof(s, {_, v -> v == 'd'})) + call assert_equal(-1, indexof(s, {_, v -> "v == 'd'"})) + call assert_equal(-1, indexof([], {i, v -> v == 'a'})) + call assert_equal(-1, indexof([1, 2, 3], {_, v -> "v == 2"})) call assert_equal(-1, indexof(test_null_list(), {i, v -> v == 'a'})) call assert_equal(-1, indexof(l, test_null_string())) call assert_equal(-1, indexof(l, test_null_function())) diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 244021c7eb..55ede984d9 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -2074,10 +2074,36 @@ def Test_indexof() var b = 0zdeadbeef indexof(b, "v:val == 0xef")->assert_equal(3) - def TestIdx(k: number, v: dict<any>): bool + def TestIdx1(k: number, v: dict<any>): bool return v.color == 'blue' enddef - indexof(l, TestIdx)->assert_equal(1) + indexof(l, TestIdx1)->assert_equal(1) + + var lines =<< trim END + def TestIdx(v: dict<any>): bool + return v.color == 'blue' + enddef + + indexof([{color: "red"}], TestIdx) + END + v9.CheckDefAndScriptFailure(lines, ['E176: Invalid number of arguments', 'E118: Too many arguments for function']) + + lines =<< trim END + def TestIdx(k: number, v: dict<any>) + enddef + + indexof([{color: "red"}], TestIdx) + END + v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(?number, ?any): bool', 'E1031: Cannot use void value']) + + lines =<< trim END + def TestIdx(k: number, v: dict<any>): string + return "abc" + enddef + + indexof([{color: "red"}], TestIdx) + END + v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(?number, ?any): bool', 'E1135: Using a String as a Bool']) enddef def Test_input() diff --git a/src/version.c b/src/version.c index f901eeaad8..3b5193fa58 100644 --- a/src/version.c +++ b/src/version.c @@ -736,6 +736,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 204, +/**/ 203, /**/ 202, |