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:
@@ -4519,6 +4519,36 @@ def Test_echo_uninit_variables()
|
|||||||
endif
|
endif
|
||||||
enddef
|
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.
|
" Keep this last, it messes up highlighting.
|
||||||
def Test_substitute_cmd()
|
def Test_substitute_cmd()
|
||||||
new
|
new
|
||||||
|
@@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1050,
|
||||||
/**/
|
/**/
|
||||||
1049,
|
1049,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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
|
if (l->lv_type != NULL && (l->lv_first == NULL
|
||||||
|| (flags & TVTT_MORE_SPECIFIC) == 0
|
|| (flags & TVTT_MORE_SPECIFIC) == 0
|
||||||
|| l->lv_type->tt_member != &t_any))
|
|| 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)
|
if (l->lv_first == &range_list_item)
|
||||||
return &t_list_number;
|
return &t_list_number;
|
||||||
if (l->lv_copyID == copyID)
|
if (l->lv_copyID == copyID)
|
||||||
|
Reference in New Issue
Block a user