summaryrefslogtreecommitdiffstats
path: root/src/blob.c
diff options
context:
space:
mode:
authorErnie Rael <errael@raelity.com>2023-03-19 21:23:38 +0000
committerBram Moolenaar <Bram@vim.org>2023-03-19 21:23:38 +0000
commite6d40dcdc7227594935d2db01eca29f0e575dcee (patch)
treecceadc9510c19f5ba8f99e26954bf8fbef40b6d6 /src/blob.c
parent7c4516fe93d865f4ef1877181f8156b8b9331856 (diff)
patch 9.0.1416: crash when collection is modified when using filter()v9.0.1416
Problem: Crash when collection is modified when using filter(). Solution: Lock the list/dict/blob. (Ernie Rael, closes #12183)
Diffstat (limited to 'src/blob.c')
-rw-r--r--src/blob.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/blob.c b/src/blob.c
index bfc77231ce..6f4297345d 100644
--- a/src/blob.c
+++ b/src/blob.c
@@ -592,9 +592,10 @@ blob_filter_map(
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 @@ blob_filter_map(
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 @@ blob_filter_map(
// 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 @@ blob_filter_map(
++idx;
}
+ b->bv_lock = prev_lock;
if (fc != NULL)
remove_funccal();
}