patch 9.0.1416: crash when collection is modified when using filter()
Problem: Crash when collection is modified when using filter().
Solution: Lock the list/dict/blob. (Ernie Rael, closes #12183)
diff --git a/src/blob.c b/src/blob.c
index bfc7723..6f42973 100644
--- a/src/blob.c
+++ b/src/blob.c
@@ -592,9 +592,10 @@
blob_T *blob_arg,
filtermap_T filtermap,
typval_T *expr,
+ char_u *arg_errmsg,
typval_T *rettv)
{
- blob_T *b;
+ blob_T *b = blob_arg;
int i;
typval_T tv;
varnumber_T val;
@@ -609,7 +610,8 @@
rettv->v_type = VAR_BLOB;
rettv->vval.v_blob = NULL;
}
- if ((b = blob_arg) == NULL)
+ if (b == NULL || (filtermap == FILTERMAP_FILTER
+ && value_check_lock(b->bv_lock, arg_errmsg, TRUE)))
return;
b_ret = b;
@@ -623,6 +625,10 @@
// set_vim_var_nr() doesn't set the type
set_vim_var_type(VV_KEY, VAR_NUMBER);
+ int prev_lock = b->bv_lock;
+ if (b->bv_lock == 0)
+ b->bv_lock = VAR_LOCKED;
+
// Create one funccal_T for all eval_expr_typval() calls.
fc = eval_expr_get_funccal(expr, &newtv);
@@ -658,6 +664,7 @@
++idx;
}
+ b->bv_lock = prev_lock;
if (fc != NULL)
remove_funccal();
}