Mercurial > vim
changeset 9442:4fe3772969cf v7.4.2002
commit https://github.com/vim/vim/commit/a06ec8f345eabb66e5b7d7c0192cfebdde63115d
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Jul 8 20:11:07 2016 +0200
patch 7.4.2002
Problem: Crash when passing number to filter() or map().
Solution: Convert to a string. (Ozaki Kiichi)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 08 Jul 2016 20:15:06 +0200 |
parents | 239d61c7baa2 |
children | 42951a7c932c |
files | src/eval.c src/testdir/test_filter_map.vim src/version.c |
diffstat | 3 files changed, 11 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -12044,6 +12044,7 @@ filter_map_one(typval_T *tv, typval_T *e { 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 *e 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 *e } 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;
--- a/src/testdir/test_filter_map.vim +++ b/src/testdir/test_filter_map.vim @@ -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