vim-patch:7.4.2160 (#5952)

Problem:    setmatches() mixes up values. (Nikolai Pavlov)
Solution:   Save the string instead of reusing a shared buffer.

7dc5e2e486
This commit is contained in:
Shougo 2017-01-15 10:38:57 +09:00 committed by Justin M. Keyes
parent c88e4a270d
commit a6be6df5d6
3 changed files with 14 additions and 4 deletions

View File

@ -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;

View File

@ -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

View File

@ -280,7 +280,7 @@ static int included_patches[] = {
2163,
2162,
// 2161,
// 2160,
2160,
// 2159,
2158,
// 2157 NA