]> granicus.if.org Git - vim/commitdiff
patch 8.2.0399: various memory leaks v8.2.0399
authorBram Moolenaar <Bram@vim.org>
Wed, 18 Mar 2020 14:23:16 +0000 (15:23 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 18 Mar 2020 14:23:16 +0000 (15:23 +0100)
Problem:    Various memory leaks.
Solution:   Avoid the leaks. (Ozaki Kiichi, closes #5803)

src/ex_docmd.c
src/ex_getln.c
src/menu.c
src/message.c
src/scriptfile.c
src/userfunc.c
src/version.c

index 58ea7c86388fb9be22095f3914ba348644b4b976..fb084d32d56891490cf3607089b0bbcf62899ac1 100644 (file)
@@ -1346,6 +1346,18 @@ do_cmdline(
        restore_dbg_stuff(&debug_saved);
 
     msg_list = saved_msg_list;
+
+    // Cleanup if "cs_emsg_silent_list" remains.
+    if (cstack.cs_emsg_silent_list != NULL)
+    {
+       eslist_T *elem, *temp;
+
+       for (elem = cstack.cs_emsg_silent_list; elem != NULL; elem = temp)
+       {
+           temp = elem->next;
+           vim_free(elem);
+       }
+    }
 #endif // FEAT_EVAL
 
     /*
index ca164cd2f1c95139917f35d915f20779b0d7ecb2..7193a2ac6bc747eaaaac030a8f5183543efb54c3 100644 (file)
@@ -4188,6 +4188,7 @@ open_cmdwin(void)
     if (win_split((int)p_cwh, WSP_BOT) == FAIL)
     {
        beep_flush();
+       ga_clear(&winsizes);
        return K_IGNORE;
     }
     cmdwin_type = get_cmdline_type();
index 3a9d2e41f2a33f965cb00ccb46eded2e0478ae00..0c8887945a72abc2954105deb1cb31858faed2cd 100644 (file)
@@ -2882,10 +2882,16 @@ menuitem_getinfo(vimmenu_T *menu, int modes, dict_T *dict)
        if (bit < MENU_MODES) // just in case, avoid Coverity warning
        {
            if (menu->strings[bit] != NULL)
+           {
+               char_u *tofree = NULL;
+
                status = dict_add_string(dict, "rhs",
                        *menu->strings[bit] == NUL
-                               ? vim_strsave((char_u *)"<Nop>")
-                               : str2special_save(menu->strings[bit], FALSE));
+                               ? (char_u *)"<Nop>"
+                               : (tofree = str2special_save(
+                                                 menu->strings[bit], FALSE)));
+               vim_free(tofree);
+           }
            if (status == OK)
                status = dict_add_bool(dict, "noremenu",
                                             menu->noremap[bit] == REMAP_NONE);
index 0119145cf4a27ee851445486b5e8ec923fd33a26..fbddfadcbb5bad1390d11c378add6822d92ab73e 100644 (file)
@@ -865,6 +865,7 @@ emsg_namelen(char *msg, char_u *name, int len)
     char_u *copy = vim_strnsave((char_u *)name, len);
 
     semsg(msg, copy == NULL ? "NULL" : (char *)copy);
+    vim_free(copy);
 }
 
 /*
index 9c644e2b02bc6875fb6897482278327ccda075ca..838d5f6420a022d3439075f3701b5fadfdd0d838 100644 (file)
@@ -1133,7 +1133,8 @@ do_source(
     {
        // Already loaded and no need to load again, return here.
        *ret_sid = sid;
-       return OK;
+       retval = OK;
+       goto theend;
     }
 #endif
 
index c6c6cec3cb955928758370573f4541d5f13a4dd8..32b9fb5ad704b28f535ecf4d627aed1434514fc7 100644 (file)
@@ -942,6 +942,8 @@ func_clear_items(ufunc_T *fp)
     ga_clear_strings(&(fp->uf_lines));
     VIM_CLEAR(fp->uf_name_exp);
     VIM_CLEAR(fp->uf_arg_types);
+    VIM_CLEAR(fp->uf_def_arg_idx);
+    VIM_CLEAR(fp->uf_va_name);
     ga_clear(&fp->uf_type_list);
 #ifdef FEAT_PROFILE
     VIM_CLEAR(fp->uf_tml_count);
@@ -3086,11 +3088,11 @@ ex_function(exarg_T *eap)
 
 erret:
     ga_clear_strings(&newargs);
-    ga_clear_strings(&argtypes);
     ga_clear_strings(&default_args);
 errret_2:
     ga_clear_strings(&newlines);
 ret_free:
+    ga_clear_strings(&argtypes);
     vim_free(skip_until);
     vim_free(line_to_free);
     vim_free(fudi.fd_newkey);
index 25b81882f8911fb38b1165db4ff044753728be85..686e045c01eb57247a23109662871eb7d223578e 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    399,
 /**/
     398,
 /**/