changeset 19685:d64f403289db v8.2.0399

patch 8.2.0399: various memory leaks Commit: https://github.com/vim/vim/commit/292b90d4fa11022661f449dd3efb73d5ac737313 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Mar 18 15:23:16 2020 +0100 patch 8.2.0399: various memory leaks Problem: Various memory leaks. Solution: Avoid the leaks. (Ozaki Kiichi, closes https://github.com/vim/vim/issues/5803)
author Bram Moolenaar <Bram@vim.org>
date Wed, 18 Mar 2020 15:30:04 +0100
parents 0b7b0650000a
children a042d32afa7d
files src/ex_docmd.c src/ex_getln.c src/menu.c src/message.c src/scriptfile.c src/userfunc.c src/version.c
diffstat 7 files changed, 29 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -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
 
     /*
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -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();
--- a/src/menu.c
+++ b/src/menu.c
@@ -2882,10 +2882,16 @@ menuitem_getinfo(vimmenu_T *menu, int mo
 	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);
--- a/src/message.c
+++ b/src/message.c
@@ -865,6 +865,7 @@ emsg_namelen(char *msg, char_u *name, in
     char_u *copy = vim_strnsave((char_u *)name, len);
 
     semsg(msg, copy == NULL ? "NULL" : (char *)copy);
+    vim_free(copy);
 }
 
 /*
--- a/src/scriptfile.c
+++ b/src/scriptfile.c
@@ -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
 
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -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);
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    399,
+/**/
     398,
 /**/
     397,