]> granicus.if.org Git - vim/commitdiff
patch 7.4.1847 v7.4.1847
authorBram Moolenaar <Bram@vim.org>
Wed, 25 May 2016 20:51:17 +0000 (22:51 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 25 May 2016 20:51:17 +0000 (22:51 +0200)
Problem:    Getting an item from a NULL dict crashes.  Setting a register to a
            NULL list crashes. (Nikolai Pavlov, issue #768)  Comparing a NULL
            dict with a NULL dict fails.
Solution:   Properly check for NULL.

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

index c8d84c5d5b4b316cb4a20feb0c7776e2c1863a5e..3578c9997cd75da4b5e6b1a774e3973d28d3ebdd 100644 (file)
@@ -6230,6 +6230,8 @@ dict_equal(
     dictitem_T *item2;
     int                todo;
 
+    if (d1 == NULL && d2 == NULL)
+       return TRUE;
     if (d1 == NULL || d2 == NULL)
        return FALSE;
     if (d1 == d2)
@@ -7763,6 +7765,8 @@ dict_find(dict_T *d, char_u *key, int len)
     char_u     *tofree = NULL;
     hashitem_T *hi;
 
+    if (d == NULL)
+       return NULL;
     if (len < 0)
        akey = key;
     else if (len >= AKEYLEN)
@@ -18603,8 +18607,12 @@ f_setreg(typval_T *argvars, typval_T *rettv)
        char_u          buf[NUMBUFLEN];
        char_u          **curval;
        char_u          **curallocval;
-       int             len = argvars[1].vval.v_list->lv_len;
+       list_T          *ll = argvars[1].vval.v_list;
        listitem_T      *li;
+       int             len;
+
+       /* If the list is NULL handle like an empty list. */
+       len = ll == NULL ? 0 : ll->lv_len;
 
        /* First half: use for pointers to result lines; second half: use for
         * pointers to allocated copies. */
@@ -18615,7 +18623,7 @@ f_setreg(typval_T *argvars, typval_T *rettv)
        allocval = lstval + len + 2;
        curallocval = allocval;
 
-       for (li = argvars[1].vval.v_list->lv_first; li != NULL;
+       for (li = ll == NULL ? NULL : ll->lv_first; li != NULL;
                                                             li = li->li_next)
        {
            strval = get_tv_string_buf_chk(&li->li_tv, buf);
index 142455bfe151a3f16f46bb21f8decc7ef3c608f0..7d7870e5343cdee3e397234eef8fb5761868a051 100644 (file)
@@ -90,3 +90,14 @@ func Test_loop_over_null_list()
     call assert_true(0, 'should not get here')
   endfor
 endfunc
+
+func Test_compare_null_dict()
+  call assert_fails('let x = test_null_dict()[10]')
+  call assert_equal({}, {})
+  call assert_equal(test_null_dict(), test_null_dict())
+  call assert_notequal({}, test_null_dict())
+endfunc
+
+func Test_set_reg_null_list()
+  call setreg('x', test_null_list())
+endfunc
index 20267a7f1bdfd0bc1297d63c360ef36f45ef2db3..8725ce808a244b902fc714e44d0fd169862570ed 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1847,
 /**/
     1846,
 /**/