summaryrefslogtreecommitdiffstats
path: root/src/dict.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/dict.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/dict.c')
-rw-r--r--src/dict.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/src/dict.c b/src/dict.c
index 74501ffe31..1ce01c15b6 100644
--- a/src/dict.c
+++ b/src/dict.c
@@ -1305,7 +1305,7 @@ dict_extend_func(
action = (char_u *)"force";
if (type != NULL && check_typval_arg_type(type, &argvars[1],
- func_name, 2) == FAIL)
+ func_name, 2) == FAIL)
return;
dict_extend(d1, d2, action, func_name);
@@ -1333,7 +1333,6 @@ dict_filter_map(
typval_T *expr,
typval_T *rettv)
{
- int prev_lock;
dict_T *d_ret = NULL;
hashtab_T *ht;
hashitem_T *hi;
@@ -1353,8 +1352,6 @@ dict_filter_map(
&& value_check_lock(d->dv_lock, arg_errmsg, TRUE)))
return;
- prev_lock = d->dv_lock;
-
if (filtermap == FILTERMAP_MAPNEW)
{
if (rettv_dict_alloc(rettv) == FAIL)
@@ -1365,7 +1362,8 @@ dict_filter_map(
// Create one funccal_T for all eval_expr_typval() calls.
fc = eval_expr_get_funccal(expr, &newtv);
- if (filtermap != FILTERMAP_FILTER && d->dv_lock == 0)
+ int prev_lock = d->dv_lock;
+ if (d->dv_lock == 0)
d->dv_lock = VAR_LOCKED;
ht = &d->dv_hashtab;
hash_lock(ht);