# HG changeset patch # User Bram Moolenaar # Date 1631394902 -7200 # Node ID b2c00659152ad84c421848d919749ca22cd7175b # Parent 829a412396db2f213d6fef80be9e7b21e9c62359 patch 8.2.3429: leaking memory when assigning to list or dict Commit: https://github.com/vim/vim/commit/464393a6961d9b9de2bfe9c05f8e2ae5bdec0293 Author: Bram Moolenaar 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. diff --git a/src/evalvars.c b/src/evalvars.c --- 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 diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/vim9type.c b/src/vim9type.c --- 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) {