patch 8.2.0175: crash when removing list element in map()
Problem: Crash when removing list element in map().
Solution: Lock the list. (closes #2652)
diff --git a/src/list.c b/src/list.c
index 855a20d..518423b 100644
--- a/src/list.c
+++ b/src/list.c
@@ -1782,6 +1782,10 @@
if (argvars[0].v_type == VAR_DICT)
{
+ int prev_lock = d->dv_lock;
+
+ if (map && d->dv_lock == 0)
+ d->dv_lock = VAR_LOCKED;
ht = &d->dv_hashtab;
hash_lock(ht);
todo = (int)ht->ht_used;
@@ -1813,6 +1817,7 @@
}
}
hash_unlock(ht);
+ d->dv_lock = prev_lock;
}
else if (argvars[0].v_type == VAR_BLOB)
{
@@ -1855,10 +1860,14 @@
}
else // argvars[0].v_type == VAR_LIST
{
+ int prev_lock = l->lv_lock;
+
// set_vim_var_nr() doesn't set the type
set_vim_var_type(VV_KEY, VAR_NUMBER);
range_list_materialize(l);
+ if (map && l->lv_lock == 0)
+ l->lv_lock = VAR_LOCKED;
for (li = l->lv_first; li != NULL; li = nli)
{
if (map && var_check_lock(li->li_tv.v_lock, arg_errmsg, TRUE))
@@ -1872,6 +1881,7 @@
listitem_remove(l, li);
++idx;
}
+ l->lv_lock = prev_lock;
}
restore_vimvar(VV_KEY, &save_key);