Mercurial > vim
changeset 25788:b2c00659152a v8.2.3429
patch 8.2.3429: leaking memory when assigning to list or dict
Commit: https://github.com/vim/vim/commit/464393a6961d9b9de2bfe9c05f8e2ae5bdec0293
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Sep 11 23:07:44 2021 +0200
patch 8.2.3429: leaking memory when assigning to list or dict
Problem: Leaking memory when assigning to list or dict.
Solution: Free the list or dict type before overwriting it.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 11 Sep 2021 23:15:02 +0200 |
parents | 829a412396db |
children | 3afd5ab3d69a |
files | src/evalvars.c src/version.c src/vim9type.c |
diffstat | 3 files changed, 19 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/evalvars.c +++ b/src/evalvars.c @@ -3462,9 +3462,21 @@ set_var_const( if (vim9script && type != NULL) { if (type->tt_type == VAR_DICT && dest_tv->vval.v_dict != NULL) - dest_tv->vval.v_dict->dv_type = alloc_type(type); + { + if (dest_tv->vval.v_dict->dv_type != type) + { + free_type(dest_tv->vval.v_dict->dv_type); + dest_tv->vval.v_dict->dv_type = alloc_type(type); + } + } else if (type->tt_type == VAR_LIST && dest_tv->vval.v_list != NULL) - dest_tv->vval.v_list->lv_type = alloc_type(type); + { + if (dest_tv->vval.v_list->lv_type != type) + { + free_type(dest_tv->vval.v_list->lv_type); + dest_tv->vval.v_list->lv_type = alloc_type(type); + } + } } // ":const var = value" locks the value
--- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3429, +/**/ 3428, /**/ 3427,
--- a/src/vim9type.c +++ b/src/vim9type.c @@ -258,7 +258,7 @@ func_type_add_arg_types( typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int do_member) { type_T *type; - type_T *member_type = &t_any; + type_T *member_type = NULL; int argcount = 0; int min_argcount = 0; @@ -268,6 +268,8 @@ typval2type_int(typval_T *tv, int copyID return &t_bool; if (tv->v_type == VAR_STRING) return &t_string; + if (tv->v_type == VAR_BLOB) + return &t_blob; if (tv->v_type == VAR_LIST) {