# HG changeset patch # User Bram Moolenaar # Date 1584541804 -3600 # Node ID d64f403289dba6affa3e01298a3d7c6961bfd54c # Parent 0b7b0650000a6b5d94470ee2917e77cfa3148c31 patch 8.2.0399: various memory leaks Commit: https://github.com/vim/vim/commit/292b90d4fa11022661f449dd3efb73d5ac737313 Author: Bram Moolenaar 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) diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- 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 /* diff --git a/src/ex_getln.c b/src/ex_getln.c --- 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(); diff --git a/src/menu.c b/src/menu.c --- 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 *)"") - : str2special_save(menu->strings[bit], FALSE)); + ? (char_u *)"" + : (tofree = str2special_save( + menu->strings[bit], FALSE))); + vim_free(tofree); + } if (status == OK) status = dict_add_bool(dict, "noremenu", menu->noremap[bit] == REMAP_NONE); diff --git a/src/message.c b/src/message.c --- 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); } /* diff --git a/src/scriptfile.c b/src/scriptfile.c --- 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 diff --git a/src/userfunc.c b/src/userfunc.c --- 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); diff --git a/src/version.c b/src/version.c --- 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,