comparison src/list.c @ 25495:7144d2ffc86b v8.2.3284

patch 8.2.3284: no error for insert() or remove() changing a locked blob Commit: https://github.com/vim/vim/commit/80d7395dcfe96158428da6bb3d28a6eee1244e28 Author: Sean Dewar <seandewar@users.noreply.github.com> Date: Wed Aug 4 19:25:54 2021 +0200 patch 8.2.3284: no error for insert() or remove() changing a locked blob Problem: No error for insert() or remove() changing a locked blob. Solution: Check a blob is not locked before changing it. (Sean Dewar, closes #8696)
author Bram Moolenaar <Bram@vim.org>
date Wed, 04 Aug 2021 19:30:04 +0200
parents e8e2c4d33b9b
children 0082503ff2ff
comparison
equal deleted inserted replaced
25494:bdb60211e4d3 25495:7144d2ffc86b
2815 || check_for_opt_number_arg(argvars, 2) == FAIL)) 2815 || check_for_opt_number_arg(argvars, 2) == FAIL))
2816 return; 2816 return;
2817 2817
2818 if (argvars[0].v_type == VAR_BLOB) 2818 if (argvars[0].v_type == VAR_BLOB)
2819 { 2819 {
2820 int val, len; 2820 blob_T *b = argvars[0].vval.v_blob;
2821 char_u *p; 2821
2822 2822 if (b == NULL)
2823 if (argvars[0].vval.v_blob == NULL)
2824 { 2823 {
2825 if (in_vim9script()) 2824 if (in_vim9script())
2826 emsg(_(e_cannot_add_to_null_blob)); 2825 emsg(_(e_cannot_add_to_null_blob));
2827 return; 2826 }
2828 } 2827 else if (!value_check_lock(b->bv_lock,
2829 2828 (char_u *)N_("insert() argument"), TRUE))
2830 len = blob_len(argvars[0].vval.v_blob); 2829 {
2831 if (argvars[2].v_type != VAR_UNKNOWN) 2830 int val, len;
2832 { 2831 char_u *p;
2833 before = (long)tv_get_number_chk(&argvars[2], &error); 2832
2833 len = blob_len(b);
2834 if (argvars[2].v_type != VAR_UNKNOWN)
2835 {
2836 before = (long)tv_get_number_chk(&argvars[2], &error);
2837 if (error)
2838 return; // type error; errmsg already given
2839 if (before < 0 || before > len)
2840 {
2841 semsg(_(e_invarg2), tv_get_string(&argvars[2]));
2842 return;
2843 }
2844 }
2845 val = tv_get_number_chk(&argvars[1], &error);
2834 if (error) 2846 if (error)
2835 return; // type error; errmsg already given
2836 if (before < 0 || before > len)
2837 {
2838 semsg(_(e_invarg2), tv_get_string(&argvars[2]));
2839 return; 2847 return;
2840 } 2848 if (val < 0 || val > 255)
2841 } 2849 {
2842 val = tv_get_number_chk(&argvars[1], &error); 2850 semsg(_(e_invarg2), tv_get_string(&argvars[1]));
2843 if (error) 2851 return;
2844 return; 2852 }
2845 if (val < 0 || val > 255) 2853
2846 { 2854 if (ga_grow(&b->bv_ga, 1) == FAIL)
2847 semsg(_(e_invarg2), tv_get_string(&argvars[1])); 2855 return;
2848 return; 2856 p = (char_u *)b->bv_ga.ga_data;
2849 } 2857 mch_memmove(p + before + 1, p + before, (size_t)len - before);
2850 2858 *(p + before) = val;
2851 if (ga_grow(&argvars[0].vval.v_blob->bv_ga, 1) == FAIL) 2859 ++b->bv_ga.ga_len;
2852 return; 2860
2853 p = (char_u *)argvars[0].vval.v_blob->bv_ga.ga_data; 2861 copy_tv(&argvars[0], rettv);
2854 mch_memmove(p + before + 1, p + before, (size_t)len - before); 2862 }
2855 *(p + before) = val;
2856 ++argvars[0].vval.v_blob->bv_ga.ga_len;
2857
2858 copy_tv(&argvars[0], rettv);
2859 } 2863 }
2860 else if (argvars[0].v_type != VAR_LIST) 2864 else if (argvars[0].v_type != VAR_LIST)
2861 semsg(_(e_listblobarg), "insert()"); 2865 semsg(_(e_listblobarg), "insert()");
2862 else 2866 else
2863 { 2867 {
2915 return; 2919 return;
2916 2920
2917 if (argvars[0].v_type == VAR_DICT) 2921 if (argvars[0].v_type == VAR_DICT)
2918 dict_remove(argvars, rettv, arg_errmsg); 2922 dict_remove(argvars, rettv, arg_errmsg);
2919 else if (argvars[0].v_type == VAR_BLOB) 2923 else if (argvars[0].v_type == VAR_BLOB)
2920 blob_remove(argvars, rettv); 2924 blob_remove(argvars, rettv, arg_errmsg);
2921 else if (argvars[0].v_type == VAR_LIST) 2925 else if (argvars[0].v_type == VAR_LIST)
2922 list_remove(argvars, rettv, arg_errmsg); 2926 list_remove(argvars, rettv, arg_errmsg);
2923 else 2927 else
2924 semsg(_(e_listdictblobarg), "remove()"); 2928 semsg(_(e_listdictblobarg), "remove()");
2925 } 2929 }