]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.0204: indexof() may leak memory v9.0.0204
authorYegappan Lakshmanan <yegappan@yahoo.com>
Sun, 14 Aug 2022 11:07:11 +0000 (12:07 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 14 Aug 2022 11:07:11 +0000 (12:07 +0100)
Problem:    indexof() may leak memory.
Solution:   Free allocated values. (Yegappan Lakshmanan, closes #10916)

src/evalfunc.c
src/testdir/test_blob.vim
src/testdir/test_listdict.vim
src/testdir/test_vim9_builtin.vim
src/version.c

index 4f68845a169e6d5910b8cbfd20d30ea7257ad6f3..3817352ca3cf7c28421e2b0986d9fc1cbe8c2d00 100644 (file)
@@ -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;
     }
 
index 46f2d61ad3aa66cf3aa9fa5afc91d23de129ee9a..46370c4749894ce4dde667972f7e7c79055051e1 100644 (file)
@@ -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"))
index 2c4e5c722dc6595e6fa15c318e24e64b9b940245..bba4e3e1e1744d1c37d7b37e0574e4a456c10984 100644 (file)
@@ -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()))
index 244021c7eb281373c3a74fe7131be48cc8618438..55ede984d949a9e026f2ce29eb504c59b406bcac 100644 (file)
@@ -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()
index f901eeaad8e3716318cb3d7625402ebf07a6ed2f..3b5193fa58a37c68e54c9aade54500bbd13dbec3 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    204,
 /**/
     203,
 /**/