]> granicus.if.org Git - vim/commitdiff
patch 7.4.2002 v7.4.2002
authorBram Moolenaar <Bram@vim.org>
Fri, 8 Jul 2016 18:11:07 +0000 (20:11 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 8 Jul 2016 18:11:07 +0000 (20:11 +0200)
Problem:    Crash when passing number to filter() or map().
Solution:   Convert to a string. (Ozaki Kiichi)

src/eval.c
src/testdir/test_filter_map.vim
src/version.c

index 445b6b91c45cee7ced93cfe33d1014afb1fb13f1..a51225d56c826df07353be243e51c695a69267a1 100644 (file)
@@ -12044,6 +12044,7 @@ filter_map_one(typval_T *tv, typval_T *expr, int map, int *remp)
 {
     typval_T   rettv;
     typval_T   argv[3];
+    char_u     buf[NUMBUFLEN];
     char_u     *s;
     int                retval = FAIL;
     int                dummy;
@@ -12051,9 +12052,9 @@ filter_map_one(typval_T *tv, typval_T *expr, int map, int *remp)
     copy_tv(tv, &vimvars[VV_VAL].vv_tv);
     argv[0] = vimvars[VV_KEY].vv_tv;
     argv[1] = vimvars[VV_VAL].vv_tv;
-    s = expr->vval.v_string;
     if (expr->v_type == VAR_FUNC)
     {
+       s = expr->vval.v_string;
        if (call_func(s, (int)STRLEN(s),
                    &rettv, 2, argv, 0L, 0L, &dummy, TRUE, NULL, NULL) == FAIL)
            goto theend;
@@ -12070,6 +12071,9 @@ filter_map_one(typval_T *tv, typval_T *expr, int map, int *remp)
     }
     else
     {
+       s = get_tv_string_buf_chk(expr, buf);
+       if (s == NULL)
+           goto theend;
        s = skipwhite(s);
        if (eval1(&s, &rettv, TRUE) == FAIL)
            goto theend;
index 6bb063c76d5dae636dedb93fcb41a77d7477ab6b..c8d64ce0a44dc7909be903312dcde30e0b289bf1 100644 (file)
@@ -5,10 +5,12 @@ func Test_filter_map_list_expr_string()
   " filter()
   call assert_equal([2, 3, 4], filter([1, 2, 3, 4], 'v:val > 1'))
   call assert_equal([3, 4], filter([1, 2, 3, 4], 'v:key > 1'))
+  call assert_equal([], filter([1, 2, 3, 4], 0))
 
   " map()
   call assert_equal([2, 4, 6, 8], map([1, 2, 3, 4], 'v:val * 2'))
   call assert_equal([0, 2, 4, 6], map([1, 2, 3, 4], 'v:key * 2'))
+  call assert_equal([9, 9, 9, 9], map([1, 2, 3, 4], 9))
 endfunc
 
 " dict with expression string
@@ -18,10 +20,12 @@ func Test_filter_map_dict_expr_string()
   " filter()
   call assert_equal({"bar": 2, "baz": 3}, filter(copy(dict), 'v:val > 1'))
   call assert_equal({"foo": 1, "baz": 3}, filter(copy(dict), 'v:key > "bar"'))
+  call assert_equal({}, filter(copy(dict), 0))
 
   " map()
   call assert_equal({"foo": 2, "bar": 4, "baz": 6}, map(copy(dict), 'v:val * 2'))
   call assert_equal({"foo": "f", "bar": "b", "baz": "b"}, map(copy(dict), 'v:key[0]'))
+  call assert_equal({"foo": 9, "bar": 9, "baz": 9}, map(copy(dict), 9))
 endfunc
 
 " list with funcref
index 4dcb286aab3d38722212d580de3aed338193df3c..38193e2a310c435db3fe692e15f3fdd9a4953002 100644 (file)
@@ -758,6 +758,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2002,
 /**/
     2001,
 /**/