1
0
forked from aniani/vim

patch 9.0.1050: using freed memory when assigning to variable twice

Problem:    Using freed memory when assigning to variable twice.
Solution:   Make copy of the list type. (closes #11691)
This commit is contained in:
Bram Moolenaar
2022-12-12 18:56:32 +00:00
parent 67578e5bcf
commit 6342e2c5a6
3 changed files with 34 additions and 1 deletions

View File

@@ -4519,6 +4519,36 @@ def Test_echo_uninit_variables()
endif
enddef
def Test_free_type_before_use()
# this rather complicated script was freeing a type before using it
var lines =<< trim END
vim9script
def Scan(rel: list<dict<any>>): func(func(dict<any>))
return (Emit: func(dict<any>)) => {
for t in rel
Emit(t)
endfor
}
enddef
def Build(Cont: func(func(dict<any>))): list<dict<any>>
var rel: list<dict<any>> = []
Cont((t) => {
add(rel, t)
})
return rel
enddef
var R = [{A: 0}]
var result = Scan(R)->Build()
result = Scan(R)->Build()
assert_equal(R, result)
END
v9.CheckScriptSuccess(lines)
enddef
" Keep this last, it messes up highlighting.
def Test_substitute_cmd()
new

View File

@@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1050,
/**/
1049,
/**/

View File

@@ -403,7 +403,8 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int flags)
if (l->lv_type != NULL && (l->lv_first == NULL
|| (flags & TVTT_MORE_SPECIFIC) == 0
|| l->lv_type->tt_member != &t_any))
return l->lv_type;
// make a copy, lv_type may be freed if the list is freed
return copy_type(l->lv_type, type_gap);
if (l->lv_first == &range_list_item)
return &t_list_number;
if (l->lv_copyID == copyID)