Mercurial > vim
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; |