diff options
author | Ernie Rael <errael@raelity.com> | 2023-03-19 21:23:38 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-03-19 21:23:38 +0000 |
commit | e6d40dcdc7227594935d2db01eca29f0e575dcee (patch) | |
tree | cceadc9510c19f5ba8f99e26954bf8fbef40b6d6 /src/blob.c | |
parent | 7c4516fe93d865f4ef1877181f8156b8b9331856 (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.c | 11 |
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(); } |