aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorerw7 <erw7.github@gmail.com>2020-06-07 02:00:49 +0900
committererw7 <erw7.github@gmail.com>2020-06-09 23:54:07 +0900
commitf1cbd39f7b12d2f7a2a528dbd034bacfe72809d2 (patch)
treebf5145cb51184ab93b08c507b2952b68297aefe5 /src
parent9fc3949841817921a14fa64ae3d657c936acdfc4 (diff)
downloadrneovim-f1cbd39f7b12d2f7a2a528dbd034bacfe72809d2.tar.gz
rneovim-f1cbd39f7b12d2f7a2a528dbd034bacfe72809d2.tar.bz2
rneovim-f1cbd39f7b12d2f7a2a528dbd034bacfe72809d2.zip
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) https://github.com/vim/vim/commit/5b157fe2edfdce5f77080aeac2b4a03f39eb1c1a
Diffstat (limited to 'src')
-rw-r--r--src/nvim/shada.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/nvim/shada.c b/src/nvim/shada.c
index 3b08c8a184..95257fe945 100644
--- a/src/nvim/shada.c
+++ b/src/nvim/shada.c
@@ -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;
}