diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-09-11 23:07:44 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-09-11 23:07:44 +0200 |
commit | 464393a6961d9b9de2bfe9c05f8e2ae5bdec0293 (patch) | |
tree | 1b130816e331e9fc087db460e19aa99de55fd797 | |
parent | 35a9a00afcb20897d462a766793ff45534810dc3 (diff) | |
download | vim-git-464393a6961d9b9de2bfe9c05f8e2ae5bdec0293.tar.gz |
patch 8.2.3429: leaking memory when assigning to list or dictv8.2.3429
Problem: Leaking memory when assigning to list or dict.
Solution: Free the list or dict type before overwriting it.
-rw-r--r-- | src/evalvars.c | 16 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9type.c | 4 |
3 files changed, 19 insertions, 3 deletions
diff --git a/src/evalvars.c b/src/evalvars.c index 5a26effbb..4cc0fa8e3 100644 --- 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 index 2d6f6c7bf..d10f8aabb 100644 --- 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 index c14b97fad..b9e9b27ad 100644 --- 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, garray_T *type_gap, int do_member) 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) { |