aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShougo <Shougo.Matsu@gmail.com>2017-01-15 10:38:57 +0900
committerJustin M. Keyes <justinkz@gmail.com>2017-01-15 02:38:57 +0100
commita6be6df5d6212ab9588afebde127ae4406e478d7 (patch)
tree55c4730c8ac60c801b76b0d83e2471ed197fcd30 /src
parentc88e4a270d54eae3fe8e6b93a0ed3898e4632be5 (diff)
downloadrneovim-a6be6df5d6212ab9588afebde127ae4406e478d7.tar.gz
rneovim-a6be6df5d6212ab9588afebde127ae4406e478d7.tar.bz2
rneovim-a6be6df5d6212ab9588afebde127ae4406e478d7.zip
vim-patch:7.4.2160 (#5952)
Problem: setmatches() mixes up values. (Nikolai Pavlov) Solution: Save the string instead of reusing a shared buffer. https://github.com/vim/vim/commit/7dc5e2e486fe0287601968e535902a41a39f65bb
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c8
-rw-r--r--src/nvim/testdir/test_expr.vim8
-rw-r--r--src/nvim/version.c2
3 files changed, 14 insertions, 4 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 6688405860..7a7ba9bb55 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -6726,6 +6726,7 @@ static bool get_dict_callback(dict_T *d, char *key, Callback *result)
/// Get a string item from a dictionary.
///
/// @param save whether memory should be allocated for the return value
+/// when false a shared buffer is used, can only be used once!
///
/// @return the entry or NULL if the entry doesn't exist.
char_u *get_dict_string(dict_T *d, char *key, bool save)
@@ -15445,12 +15446,11 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
}
- char_u *group = get_dict_string(d, "group", false);
+ char_u *group = get_dict_string(d, "group", true);
int priority = get_dict_number(d, "priority");
int id = get_dict_number(d, "id");
char_u *conceal = dict_find(d, (char_u *)"conceal", -1) != NULL
- ? get_dict_string(d, "conceal",
- false)
+ ? get_dict_string(d, "conceal", true)
: NULL;
if (i == 0) {
match_add(curwin, group,
@@ -15461,6 +15461,8 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
list_unref(s);
s = NULL;
}
+ xfree(group);
+ xfree(conceal);
li = li->li_next;
}
rettv->vval.v_number = 0;
diff --git a/src/nvim/testdir/test_expr.vim b/src/nvim/testdir/test_expr.vim
index 189ecce2fe..217cf6fb96 100644
--- a/src/nvim/testdir/test_expr.vim
+++ b/src/nvim/testdir/test_expr.vim
@@ -96,4 +96,12 @@ endfunc
func Test_special_char()
" The failure is only visible using valgrind.
call assert_fails('echo "\<C-">')
+
+func Test_setmatches()
+ hi def link 1 Comment
+ hi def link 2 PreProc
+ let set = [{"group": 1, "pattern": 2, "id": 3, "priority": 4, "conceal": 5}]
+ let exp = [{"group": '1', "pattern": '2', "id": 3, "priority": 4, "conceal": '5'}]
+ call setmatches(set)
+ call assert_equal(exp, getmatches())
endfunc
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 70abbcef76..0fb274dc07 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -280,7 +280,7 @@ static int included_patches[] = {
2163,
2162,
// 2161,
- // 2160,
+ 2160,
// 2159,
2158,
// 2157 NA