diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-01-31 16:28:04 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-01-31 16:28:04 +0100 |
commit | a542c680a8b42cb766e64d4ee7374ef4dacb7832 (patch) | |
tree | 136d3ff07a786de9efd06c7faf6feafc7cf9ff12 | |
parent | e2c3810c2ae290bbc2cba18eb47cc2d44e4b9797 (diff) | |
download | vim-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.c | 15 | ||||
-rw-r--r-- | src/testdir/test_assert.vim | 9 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |