summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-01-31 16:28:04 +0100
committerBram Moolenaar <Bram@vim.org>2016-01-31 16:28:04 +0100
commita542c680a8b42cb766e64d4ee7374ef4dacb7832 (patch)
tree136d3ff07a786de9efd06c7faf6feafc7cf9ff12
parente2c3810c2ae290bbc2cba18eb47cc2d44e4b9797 (diff)
downloadvim-git-a542c680a8b42cb766e64d4ee7374ef4dacb7832.tar.gz
patch 7.4.1223v7.4.1223
Problem: Crash when setting v:errors to a number. Solution: Free the typval without assuming its type. (Yasuhiro Matsumoto)
-rw-r--r--src/eval.c15
-rw-r--r--src/testdir/test_assert.vim9
-rw-r--r--src/version.c2
3 files changed, 19 insertions, 7 deletions
diff --git a/src/eval.c b/src/eval.c
index d2ebeb971..db7ae756a 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -919,6 +919,8 @@ eval_init(void)
/* add to compat scope dict */
hash_add(&compat_hashtab, p->vv_di.di_key);
}
+ vimvars[VV_VERSION].vv_nr = VIM_VERSION_100;
+
set_vim_var_nr(VV_SEARCHFORWARD, 1L);
set_vim_var_nr(VV_HLSEARCH, 1L);
set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc());
@@ -20616,11 +20618,8 @@ set_vim_var_string(
char_u *val,
int len) /* length of "val" to use or -1 (whole string) */
{
- /* Need to do this (at least) once, since we can't initialize a union.
- * Will always be invoked when "v:progname" is set. */
- vimvars[VV_VERSION].vv_nr = VIM_VERSION_100;
-
- vim_free(vimvars[idx].vv_str);
+ clear_tv(&vimvars[idx].vv_di.di_tv);
+ vimvars[idx].vv_type = VAR_STRING;
if (val == NULL)
vimvars[idx].vv_str = NULL;
else if (len == -1)
@@ -20635,7 +20634,8 @@ set_vim_var_string(
void
set_vim_var_list(int idx, list_T *val)
{
- list_unref(vimvars[idx].vv_list);
+ clear_tv(&vimvars[idx].vv_di.di_tv);
+ vimvars[idx].vv_type = VAR_LIST;
vimvars[idx].vv_list = val;
if (val != NULL)
++val->lv_refcount;
@@ -20650,7 +20650,8 @@ set_vim_var_dict(int idx, dict_T *val)
int todo;
hashitem_T *hi;
- dict_unref(vimvars[idx].vv_dict);
+ clear_tv(&vimvars[idx].vv_di.di_tv);
+ vimvars[idx].vv_type = VAR_DICT;
vimvars[idx].vv_dict = val;
if (val != NULL)
{
diff --git a/src/testdir/test_assert.vim b/src/testdir/test_assert.vim
index 70a303ffc..22046e2b8 100644
--- a/src/testdir/test_assert.vim
+++ b/src/testdir/test_assert.vim
@@ -37,6 +37,15 @@ func Test_assert_exception()
endtry
endfunc
+func Test_wrong_error_type()
+ let save_verrors = v:errors
+ let v:['errors'] = {'foo': 3}
+ call assert_equal('yes', 'no')
+ let verrors = v:errors
+ let v:errors = save_verrors
+ call assert_equal(type([]), type(verrors))
+endfunc
+
func Test_user_is_happy()
smile
sleep 300m
diff --git a/src/version.c b/src/version.c
index b521511f4..00d9c0b3d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1223,
+/**/
1222,
/**/
1221,