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