To: vim_dev@googlegroups.com Subject: Patch 8.2.0175 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0175 Problem: Crash when removing list element in map(). Solution: Lock the list. (closes #2652) Files: src/testdir/test_filter_map.vim, src/list.c *** ../vim-8.2.0174/src/testdir/test_filter_map.vim 2019-09-03 16:50:08.000000000 +0200 --- src/testdir/test_filter_map.vim 2020-01-29 22:16:28.293590203 +0100 *************** *** 93,95 **** --- 93,105 ---- call assert_fails('call map([1], "42 +")', 'E15:') call assert_fails('call filter([1], "42 +")', 'E15:') endfunc + + func Test_map_and_modify() + let l = ["abc"] + " cannot change the list halfway a map() + call assert_fails('call map(l, "remove(l, 0)[0]")', 'E741:') + + let d = #{a: 1, b: 2, c: 3} + call assert_fails('call map(d, "remove(d, v:key)[0]")', 'E741:') + call assert_fails('echo map(d, {k,v -> remove(d, k)})', 'E741:') + endfunc *** ../vim-8.2.0174/src/list.c 2020-01-29 21:27:17.574406732 +0100 --- src/list.c 2020-01-29 22:12:30.173907002 +0100 *************** *** 1782,1787 **** --- 1782,1791 ---- if (argvars[0].v_type == VAR_DICT) { + int prev_lock = d->dv_lock; + + if (map && d->dv_lock == 0) + d->dv_lock = VAR_LOCKED; ht = &d->dv_hashtab; hash_lock(ht); todo = (int)ht->ht_used; *************** *** 1813,1818 **** --- 1817,1823 ---- } } hash_unlock(ht); + d->dv_lock = prev_lock; } else if (argvars[0].v_type == VAR_BLOB) { *************** *** 1855,1864 **** --- 1860,1873 ---- } else // argvars[0].v_type == VAR_LIST { + int prev_lock = l->lv_lock; + // set_vim_var_nr() doesn't set the type set_vim_var_type(VV_KEY, VAR_NUMBER); range_list_materialize(l); + if (map && l->lv_lock == 0) + l->lv_lock = VAR_LOCKED; for (li = l->lv_first; li != NULL; li = nli) { if (map && var_check_lock(li->li_tv.v_lock, arg_errmsg, TRUE)) *************** *** 1872,1877 **** --- 1881,1887 ---- listitem_remove(l, li); ++idx; } + l->lv_lock = prev_lock; } restore_vimvar(VV_KEY, &save_key); *** ../vim-8.2.0174/src/version.c 2020-01-29 21:57:28.745607653 +0100 --- src/version.c 2020-01-29 22:05:17.123174489 +0100 *************** *** 744,745 **** --- 744,747 ---- { /* Add new patch number below this line */ + /**/ + 175, /**/ -- hundred-and-one symptoms of being an internet addict: 13. You refer to going to the bathroom as downloading. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///