vim-patch:8.2.0920: writing viminfo fails with a circular reference

Problem:    Writing viminfo fails with a circular reference.
Solution:   Use copyID to detect the cycle. (closes vim/vim#6217)
5b157fe2ed
This commit is contained in:
erw7
2020-06-07 02:00:49 +09:00
parent 9fc3949841
commit f1cbd39f7b
3 changed files with 31 additions and 18 deletions

View File

@@ -2679,7 +2679,30 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
switch (vartv.v_type) {
case VAR_FUNC:
case VAR_PARTIAL:
tv_clear(&vartv);
continue;
case VAR_DICT:
{
dict_T *di = vartv.vval.v_dict;
int copyID = get_copyID();
if (!set_ref_in_ht(&di->dv_hashtab, copyID, NULL)
&& copyID == di->dv_copyID) {
tv_clear(&vartv);
continue;
}
break;
}
case VAR_LIST:
{
list_T *l = vartv.vval.v_list;
int copyID = get_copyID();
if (!set_ref_in_list(l, copyID, NULL)
&& copyID == l->lv_copyID) {
tv_clear(&vartv);
continue;
}
break;
}
default:
break;
}