]> granicus.if.org Git - vim/commitdiff
patch 9.0.0338: return value of list_append_list() not always checked v9.0.0338
authorBram Moolenaar <Bram@vim.org>
Wed, 31 Aug 2022 10:25:06 +0000 (11:25 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 31 Aug 2022 10:25:06 +0000 (11:25 +0100)
Problem:    Return value of list_append_list() not always checked.
Solution:   Check return value and handle failure.

src/evalfunc.c
src/evalwindow.c
src/list.c
src/search.c
src/version.c

index be1b2e71f25f1bbdae7a5efc3f802d3d53daacc0..9cbd413405b06e8e9c7be40cf4d0d181fa19c02b 100644 (file)
@@ -4811,9 +4811,12 @@ f_getchangelist(typval_T *argvars, typval_T *rettv)
     l = list_alloc();
     if (l == NULL)
        return;
-
     if (list_append_list(rettv->vval.v_list, l) == FAIL)
+    {
+       vim_free(l);
        return;
+    }
+
     /*
      * The current window change list index tracks only the position for the
      * current buffer. For other buffers use the stored index for the current
@@ -5045,9 +5048,12 @@ f_getjumplist(typval_T *argvars, typval_T *rettv)
     l = list_alloc();
     if (l == NULL)
        return;
-
     if (list_append_list(rettv->vval.v_list, l) == FAIL)
+    {
+       vim_free(l);
        return;
+    }
+
     list_append_number(rettv->vval.v_list, (varnumber_T)wp->w_jumplistidx);
 
     for (i = 0; i < wp->w_jumplistlen; ++i)
index 906c269789424345425b8e377ca1d71d75fb1210..7a019627fb9f0cc9aeb4b243fa43dc66fdf407ee 100644 (file)
@@ -261,7 +261,7 @@ find_tabwin(
 }
 
 /*
- * Get the layout of the given tab page for winlayout().
+ * Get the layout of the given tab page for winlayout() and add it to "l".
  */
     static void
 get_framelayout(frame_T *fr, list_T *l, int outer)
@@ -281,7 +281,11 @@ get_framelayout(frame_T *fr, list_T *l, int outer)
        fr_list = list_alloc();
        if (fr_list == NULL)
            return;
-       list_append_list(l, fr_list);
+       if (list_append_list(l, fr_list) == FAIL)
+       {
+           vim_free(fr_list);
+           return;
+       }
     }
 
     if (fr->fr_layout == FR_LEAF)
@@ -300,7 +304,12 @@ get_framelayout(frame_T *fr, list_T *l, int outer)
        win_list = list_alloc();
        if (win_list == NULL)
            return;
-       list_append_list(fr_list, win_list);
+       if (list_append_list(fr_list, win_list) == FAIL)
+       {
+           vim_free(win_list);
+           return;
+       }
+
        child = fr->fr_child;
        while (child != NULL)
        {
index 7bc34db7f9b37173703f36b87064bbaa2f163684..5e70f2111b524eaa59c4e06493fde2b69a2e06d2 100644 (file)
@@ -1076,8 +1076,12 @@ list2items(typval_T *argvars, typval_T *rettv)
 
        if (l2 == NULL)
            break;
-       if (list_append_list(rettv->vval.v_list, l2) == FAIL
-               || list_append_number(l2, idx) == FAIL
+       if (list_append_list(rettv->vval.v_list, l2) == FAIL)
+       {
+           vim_free(l2);
+           break;
+       }
+       if (list_append_number(l2, idx) == FAIL
                || list_append_tv(l2, &li->li_tv) == FAIL)
            break;
     }
@@ -1108,8 +1112,12 @@ string2items(typval_T *argvars, typval_T *rettv)
        l2 = list_alloc();
        if (l2 == NULL)
            break;
-       if (list_append_list(rettv->vval.v_list, l2) == FAIL
-               || list_append_number(l2, idx) == FAIL
+       if (list_append_list(rettv->vval.v_list, l2) == FAIL)
+       {
+           vim_free(l2);
+           break;
+       }
+       if (list_append_number(l2, idx) == FAIL
                || list_append_string(l2, p, len) == FAIL)
            break;
        p += len;
index 0c2a990caab7bbd03a2d15979e705a0339b28939..8045bd735c8287cd1aeaddd7b749dcafcdbf471a 100644 (file)
@@ -4748,8 +4748,7 @@ fuzzy_match_in_list(
                if (items[i].score == SCORE_NONE)
                    break;
                if (items[i].lmatchpos != NULL
-                       && list_append_list(retlist, items[i].lmatchpos)
-                                                               == FAIL)
+                     && list_append_list(retlist, items[i].lmatchpos) == FAIL)
                    goto done;
            }
 
@@ -4869,17 +4868,26 @@ do_fuzzymatch(typval_T *argvars, typval_T *rettv, int retmatchpos)
        if (l == NULL)
            goto done;
        if (list_append_list(rettv->vval.v_list, l) == FAIL)
+       {
+           vim_free(l);
            goto done;
+       }
        l = list_alloc();
        if (l == NULL)
            goto done;
        if (list_append_list(rettv->vval.v_list, l) == FAIL)
+       {
+           vim_free(l);
            goto done;
+       }
        l = list_alloc();
        if (l == NULL)
            goto done;
        if (list_append_list(rettv->vval.v_list, l) == FAIL)
+       {
+           vim_free(l);
            goto done;
+       }
     }
 
     fuzzy_match_in_list(argvars[0].vval.v_list, tv_get_string(&argvars[1]),
index 1ff36ffc9bca35880c62d0bb2e1cf76347edd2bd..80914885fe2c41f7aea4f6338e7a8796bd457fc2 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    338,
 /**/
     337,
 /**/