patch 7.4.1223 v7.4.1223
authorBram Moolenaar <Bram@vim.org>
Sun, 31 Jan 2016 15:28:04 +0000 (16:28 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 31 Jan 2016 15:28:04 +0000 (16:28 +0100)
Problem:    Crash when setting v:errors to a number.
Solution:   Free the typval without assuming its type. (Yasuhiro Matsumoto)

src/eval.c
src/testdir/test_assert.vim
src/version.c

index d2ebeb971af581a890393c5b92982d637570393f..db7ae756a51531d47856100a5eb9670d6685b60c 100644 (file)
@@ -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)
     {
index 70a303ffcdaaaf8ff99be076dfbef4bde7e28de5..22046e2b8d5847e99f13ce36a5a666b671567b28 100644 (file)
@@ -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
index b521511f4f1b950dd3c183ee1916ca45cc84f853..00d9c0b3d23c51451421612e11aa9002eebc2a41 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1223,
 /**/
     1222,
 /**/