comparison src/list.c @ 32170:5848a0867b26 v9.0.1416

patch 9.0.1416: crash when collection is modified when using filter() Commit: https://github.com/vim/vim/commit/e6d40dcdc7227594935d2db01eca29f0e575dcee Author: Ernie Rael <errael@raelity.com> Date: Sun Mar 19 21:23:38 2023 +0000 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 https://github.com/vim/vim/issues/12183)
author Bram Moolenaar <Bram@vim.org>
date Sun, 19 Mar 2023 22:30:04 +0100
parents ec0d5bd9083c
children 252b06c87796
comparison
equal deleted inserted replaced
32169:763fac292d5e 32170:5848a0867b26
2396 l_ret = rettv->vval.v_list; 2396 l_ret = rettv->vval.v_list;
2397 } 2397 }
2398 // set_vim_var_nr() doesn't set the type 2398 // set_vim_var_nr() doesn't set the type
2399 set_vim_var_type(VV_KEY, VAR_NUMBER); 2399 set_vim_var_type(VV_KEY, VAR_NUMBER);
2400 2400
2401 if (filtermap != FILTERMAP_FILTER && l->lv_lock == 0) 2401 if (l->lv_lock == 0)
2402 l->lv_lock = VAR_LOCKED; 2402 l->lv_lock = VAR_LOCKED;
2403 2403
2404 // Create one funccal_T for all eval_expr_typval() calls. 2404 // Create one funccal_T for all eval_expr_typval() calls.
2405 fc = eval_expr_get_funccal(expr, &newtv); 2405 fc = eval_expr_get_funccal(expr, &newtv);
2406 2406
2574 save_did_emsg = did_emsg; 2574 save_did_emsg = did_emsg;
2575 did_emsg = FALSE; 2575 did_emsg = FALSE;
2576 2576
2577 if (argvars[0].v_type == VAR_DICT) 2577 if (argvars[0].v_type == VAR_DICT)
2578 dict_filter_map(argvars[0].vval.v_dict, filtermap, type, func_name, 2578 dict_filter_map(argvars[0].vval.v_dict, filtermap, type, func_name,
2579 arg_errmsg, expr, rettv); 2579 arg_errmsg, expr, rettv);
2580 else if (argvars[0].v_type == VAR_BLOB) 2580 else if (argvars[0].v_type == VAR_BLOB)
2581 blob_filter_map(argvars[0].vval.v_blob, filtermap, expr, rettv); 2581 blob_filter_map(argvars[0].vval.v_blob, filtermap, expr,
2582 arg_errmsg, rettv);
2582 else if (argvars[0].v_type == VAR_STRING) 2583 else if (argvars[0].v_type == VAR_STRING)
2583 string_filter_map(tv_get_string(&argvars[0]), filtermap, expr, 2584 string_filter_map(tv_get_string(&argvars[0]), filtermap, expr, rettv);
2584 rettv);
2585 else // argvars[0].v_type == VAR_LIST 2585 else // argvars[0].v_type == VAR_LIST
2586 list_filter_map(argvars[0].vval.v_list, filtermap, type, func_name, 2586 list_filter_map(argvars[0].vval.v_list, filtermap, type, func_name,
2587 arg_errmsg, expr, rettv); 2587 arg_errmsg, expr, rettv);
2588 2588
2589 restore_vimvar(VV_KEY, &save_key); 2589 restore_vimvar(VV_KEY, &save_key);
2590 restore_vimvar(VV_VAL, &save_val); 2590 restore_vimvar(VV_VAL, &save_val);
2591 2591
2592 did_emsg |= save_did_emsg; 2592 did_emsg |= save_did_emsg;