diff options
Diffstat (limited to 'data/vim/patches/8.1.1355')
-rw-r--r-- | data/vim/patches/8.1.1355 | 460 |
1 files changed, 460 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1355 b/data/vim/patches/8.1.1355 new file mode 100644 index 000000000..282277597 --- /dev/null +++ b/data/vim/patches/8.1.1355 @@ -0,0 +1,460 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1355 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1355 +Problem: Obvious mistakes are accepted as valid expressions. +Solution: Be more strict about parsing numbers. (Yasuhiro Matsumoto, + closes #3981) +Files: src/charset.c, src/eval.c, src/evalfunc.c, src/ex_cmds.c, + src/ex_getln.c, src/json.c, src/misc2.c, src/ops.c, src/option.c, + src/proto/charset.pro, src/testdir/test_expr.vim, + src/testdir/test_json.vim + + +*** ../vim-8.1.1354/src/charset.c 2019-03-21 21:45:30.883282076 +0100 +--- src/charset.c 2019-05-19 19:02:56.822368539 +0200 +*************** +*** 1776,1800 **** + * If "what" contains STR2NR_HEX recognize hex numbers + * If "what" contains STR2NR_FORCE always assume bin/oct/hex. + * If maxlen > 0, check at a maximum maxlen chars. + */ + void + vim_str2nr( + char_u *start, +! int *prep, /* return: type of number 0 = decimal, 'x' +! or 'X' is hex, '0' = octal, 'b' or 'B' +! is bin */ +! int *len, /* return: detected length of number */ +! int what, /* what numbers to recognize */ +! varnumber_T *nptr, /* return: signed result */ +! uvarnumber_T *unptr, /* return: unsigned result */ +! int maxlen) /* max length of string to check */ + { + char_u *ptr = start; +! int pre = 0; /* default is decimal */ + int negative = FALSE; + uvarnumber_T un = 0; + int n; + + if (ptr[0] == '-') + { + negative = TRUE; +--- 1776,1805 ---- + * If "what" contains STR2NR_HEX recognize hex numbers + * If "what" contains STR2NR_FORCE always assume bin/oct/hex. + * If maxlen > 0, check at a maximum maxlen chars. ++ * If strict is TRUE, check the number strictly. return *len = 0 if fail. + */ + void + vim_str2nr( + char_u *start, +! int *prep, // return: type of number 0 = decimal, 'x' +! // or 'X' is hex, '0' = octal, 'b' or 'B' +! // is bin +! int *len, // return: detected length of number +! int what, // what numbers to recognize +! varnumber_T *nptr, // return: signed result +! uvarnumber_T *unptr, // return: unsigned result +! int maxlen, // max length of string to check +! int strict) // check strictly + { + char_u *ptr = start; +! int pre = 0; // default is decimal + int negative = FALSE; + uvarnumber_T un = 0; + int n; + ++ if (len != NULL) ++ *len = 0; ++ + if (ptr[0] == '-') + { + negative = TRUE; +*************** +*** 1836,1844 **** + } + } + +! /* +! * Do the string-to-numeric conversion "manually" to avoid sscanf quirks. +! */ + n = 1; + if (pre == 'B' || pre == 'b' || what == STR2NR_BIN + STR2NR_FORCE) + { +--- 1841,1847 ---- + } + } + +! // Do the conversion manually to avoid sscanf() quirks. + n = 1; + if (pre == 'B' || pre == 'b' || what == STR2NR_BIN + STR2NR_FORCE) + { +*************** +*** 1907,1912 **** +--- 1910,1919 ---- + break; + } + } ++ // Check for an alpha-numeric character immediately following, that is ++ // most likely a typo. ++ if (strict && n - 1 != maxlen && ASCII_ISALNUM(*ptr)) ++ return; + + if (prep != NULL) + *prep = pre; +*** ../vim-8.1.1354/src/eval.c 2019-05-19 18:41:23.262148495 +0200 +--- src/eval.c 2019-05-19 18:53:32.114127645 +0200 +*************** +*** 4453,4459 **** + else + { + // decimal, hex or octal number +! vim_str2nr(*arg, NULL, &len, STR2NR_ALL, &n, NULL, 0); + *arg += len; + if (evaluate) + { +--- 4453,4465 ---- + else + { + // decimal, hex or octal number +! vim_str2nr(*arg, NULL, &len, STR2NR_ALL, &n, NULL, 0, TRUE); +! if (len == 0) +! { +! semsg(_(e_invexpr2), *arg); +! ret = FAIL; +! break; +! } + *arg += len; + if (evaluate) + { +*************** +*** 7460,7466 **** + case VAR_STRING: + if (varp->vval.v_string != NULL) + vim_str2nr(varp->vval.v_string, NULL, NULL, +! STR2NR_ALL, &n, NULL, 0); + return n; + case VAR_LIST: + emsg(_("E745: Using a List as a Number")); +--- 7466,7472 ---- + case VAR_STRING: + if (varp->vval.v_string != NULL) + vim_str2nr(varp->vval.v_string, NULL, NULL, +! STR2NR_ALL, &n, NULL, 0, FALSE); + return n; + case VAR_LIST: + emsg(_("E745: Using a List as a Number")); +*** ../vim-8.1.1354/src/evalfunc.c 2019-05-19 15:27:09.394109547 +0200 +--- src/evalfunc.c 2019-05-19 18:53:32.118127617 +0200 +*************** +*** 13199,13205 **** + case 16: what = STR2NR_HEX + STR2NR_FORCE; break; + default: what = 0; + } +! vim_str2nr(p, NULL, NULL, what, &n, NULL, 0); + if (isneg) + rettv->vval.v_number = -n; + else +--- 13199,13206 ---- + case 16: what = STR2NR_HEX + STR2NR_FORCE; break; + default: what = 0; + } +! vim_str2nr(p, NULL, NULL, what, &n, NULL, 0, FALSE); +! // Text after the number is silently ignored. + if (isneg) + rettv->vval.v_number = -n; + else +*** ../vim-8.1.1354/src/ex_cmds.c 2019-05-19 15:19:53.820445439 +0200 +--- src/ex_cmds.c 2019-05-19 18:53:32.118127617 +0200 +*************** +*** 558,564 **** + { + nrs[lnum - eap->line1].st_u.num.is_number = TRUE; + vim_str2nr(s, NULL, NULL, sort_what, +! &nrs[lnum - eap->line1].st_u.num.value, NULL, 0); + } + } + #ifdef FEAT_FLOAT +--- 558,565 ---- + { + nrs[lnum - eap->line1].st_u.num.is_number = TRUE; + vim_str2nr(s, NULL, NULL, sort_what, +! &nrs[lnum - eap->line1].st_u.num.value, +! NULL, 0, FALSE); + } + } + #ifdef FEAT_FLOAT +*** ../vim-8.1.1354/src/ex_getln.c 2019-05-09 15:12:45.168723969 +0200 +--- src/ex_getln.c 2019-05-19 18:53:32.118127617 +0200 +*************** +*** 6470,6476 **** + *str = skipwhite(*str); + if (**str == '-' || vim_isdigit(**str)) /* parse "from" part of range */ + { +! vim_str2nr(*str, NULL, &len, 0, &num, NULL, 0); + *str += len; + *num1 = (int)num; + first = TRUE; +--- 6470,6476 ---- + *str = skipwhite(*str); + if (**str == '-' || vim_isdigit(**str)) /* parse "from" part of range */ + { +! vim_str2nr(*str, NULL, &len, 0, &num, NULL, 0, FALSE); + *str += len; + *num1 = (int)num; + first = TRUE; +*************** +*** 6479,6485 **** + if (**str == ',') /* parse "to" part of range */ + { + *str = skipwhite(*str + 1); +! vim_str2nr(*str, NULL, &len, 0, &num, NULL, 0); + if (len > 0) + { + *num2 = (int)num; +--- 6479,6485 ---- + if (**str == ',') /* parse "to" part of range */ + { + *str = skipwhite(*str + 1); +! vim_str2nr(*str, NULL, &len, 0, &num, NULL, 0, FALSE); + if (len > 0) + { + *num2 = (int)num; +*** ../vim-8.1.1354/src/json.c 2019-04-12 21:19:01.265386241 +0200 +--- src/json.c 2019-05-19 18:53:32.118127617 +0200 +*************** +*** 452,458 **** + nr = 0; + len = 0; + vim_str2nr(p + 2, NULL, &len, +! STR2NR_HEX + STR2NR_FORCE, &nr, NULL, 4); + p += len + 2; + if (0xd800 <= nr && nr <= 0xdfff + && (int)(reader->js_end - p) >= 6 +--- 452,463 ---- + nr = 0; + len = 0; + vim_str2nr(p + 2, NULL, &len, +! STR2NR_HEX + STR2NR_FORCE, &nr, NULL, 4, TRUE); +! if (len == 0) +! { +! ga_clear(&ga); +! return FAIL; +! } + p += len + 2; + if (0xd800 <= nr && nr <= 0xdfff + && (int)(reader->js_end - p) >= 6 +*************** +*** 463,469 **** + /* decode surrogate pair: \ud812\u3456 */ + len = 0; + vim_str2nr(p + 2, NULL, &len, +! STR2NR_HEX + STR2NR_FORCE, &nr2, NULL, 4); + if (0xdc00 <= nr2 && nr2 <= 0xdfff) + { + p += len + 2; +--- 468,479 ---- + /* decode surrogate pair: \ud812\u3456 */ + len = 0; + vim_str2nr(p + 2, NULL, &len, +! STR2NR_HEX + STR2NR_FORCE, &nr2, NULL, 4, TRUE); +! if (len == 0) +! { +! ga_clear(&ga); +! return FAIL; +! } + if (0xdc00 <= nr2 && nr2 <= 0xdfff) + { + p += len + 2; +*************** +*** 783,789 **** + + vim_str2nr(reader->js_buf + reader->js_used, + NULL, &len, 0, /* what */ +! &nr, NULL, 0); + if (cur_item != NULL) + { + cur_item->v_type = VAR_NUMBER; +--- 793,805 ---- + + vim_str2nr(reader->js_buf + reader->js_used, + NULL, &len, 0, /* what */ +! &nr, NULL, 0, TRUE); +! if (len == 0) +! { +! emsg(_(e_invarg)); +! retval = FAIL; +! goto theend; +! } + if (cur_item != NULL) + { + cur_item->v_type = VAR_NUMBER; +*** ../vim-8.1.1354/src/misc2.c 2019-05-09 15:12:45.172723940 +0200 +--- src/misc2.c 2019-05-19 18:53:32.118127617 +0200 +*************** +*** 2832,2838 **** + bp += 3; /* skip t_xx, xx may be '-' or '>' */ + else if (STRNICMP(bp, "char-", 5) == 0) + { +! vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0); + bp += l + 5; + break; + } +--- 2832,2843 ---- + bp += 3; /* skip t_xx, xx may be '-' or '>' */ + else if (STRNICMP(bp, "char-", 5) == 0) + { +! vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0, TRUE); +! if (l == 0) +! { +! emsg(_(e_invarg)); +! return 0; +! } + bp += l + 5; + break; + } +*************** +*** 2864,2870 **** + && VIM_ISDIGIT(last_dash[6])) + { + /* <Char-123> or <Char-033> or <Char-0x33> */ +! vim_str2nr(last_dash + 6, NULL, NULL, STR2NR_ALL, NULL, &n, 0); + key = (int)n; + } + else +--- 2869,2880 ---- + && VIM_ISDIGIT(last_dash[6])) + { + /* <Char-123> or <Char-033> or <Char-0x33> */ +! vim_str2nr(last_dash + 6, NULL, &l, STR2NR_ALL, NULL, &n, 0, TRUE); +! if (l == 0) +! { +! emsg(_(e_invarg)); +! return 0; +! } + key = (int)n; + } + else +*** ../vim-8.1.1354/src/ops.c 2019-05-19 15:19:53.824445415 +0200 +--- src/ops.c 2019-05-19 18:53:32.122127587 +0200 +*************** +*** 5794,5800 **** + 0 + (dobin ? STR2NR_BIN : 0) + + (dooct ? STR2NR_OCT : 0) + + (dohex ? STR2NR_HEX : 0), +! NULL, &n, maxlen); + + /* ignore leading '-' for hex and octal and bin numbers */ + if (pre && negative) +--- 5794,5800 ---- + 0 + (dobin ? STR2NR_BIN : 0) + + (dooct ? STR2NR_OCT : 0) + + (dohex ? STR2NR_HEX : 0), +! NULL, &n, maxlen, FALSE); + + /* ignore leading '-' for hex and octal and bin numbers */ + if (pre && negative) +*** ../vim-8.1.1354/src/option.c 2019-05-09 15:12:45.176723907 +0200 +--- src/option.c 2019-05-19 18:53:32.122127587 +0200 +*************** +*** 4762,4771 **** + /* Allow negative (for 'undolevels'), octal and + * hex numbers. */ + vim_str2nr(arg, NULL, &i, STR2NR_ALL, +! &value, NULL, 0); +! if (arg[i] != NUL && !VIM_ISWHITE(arg[i])) + { +! errmsg = e_invarg; + goto skip; + } + } +--- 4762,4771 ---- + /* Allow negative (for 'undolevels'), octal and + * hex numbers. */ + vim_str2nr(arg, NULL, &i, STR2NR_ALL, +! &value, NULL, 0, TRUE); +! if (i == 0 || (arg[i] != NUL && !VIM_ISWHITE(arg[i]))) + { +! errmsg = N_("E521: Number required after ="); + goto skip; + } + } +*** ../vim-8.1.1354/src/proto/charset.pro 2018-05-17 13:52:29.000000000 +0200 +--- src/proto/charset.pro 2019-05-19 18:53:32.122127587 +0200 +*************** +*** 54,60 **** + char_u *skiptowhite_esc(char_u *p); + long getdigits(char_u **pp); + int vim_isblankline(char_u *lbuf); +! void vim_str2nr(char_u *start, int *prep, int *len, int what, varnumber_T *nptr, uvarnumber_T *unptr, int maxlen); + int hex2nr(int c); + int hexhex2nr(char_u *p); + int rem_backslash(char_u *str); +--- 54,60 ---- + char_u *skiptowhite_esc(char_u *p); + long getdigits(char_u **pp); + int vim_isblankline(char_u *lbuf); +! void vim_str2nr(char_u *start, int *prep, int *len, int what, varnumber_T *nptr, uvarnumber_T *unptr, int maxlen, int strict); + int hex2nr(int c); + int hexhex2nr(char_u *p); + int rem_backslash(char_u *str); +*** ../vim-8.1.1354/src/testdir/test_expr.vim 2018-12-15 16:08:52.998468517 +0100 +--- src/testdir/test_expr.vim 2019-05-19 18:57:21.312514000 +0200 +*************** +*** 512,514 **** +--- 512,525 ---- + call assert_equal('b', 'a'[4:0] . 'b') + call assert_equal('b', 'b' . 'a'[4:0]) + endfunc ++ ++ func Test_broken_number() ++ let X = 'bad' ++ call assert_fails('echo 1X', 'E15:') ++ call assert_fails('echo 0b1X', 'E15:') ++ call assert_fails('echo 0b12', 'E15:') ++ call assert_fails('echo 0x1X', 'E15:') ++ call assert_fails('echo 011X', 'E15:') ++ call assert_equal(2, str2nr('2a')) ++ call assert_fails('inoremap <Char-0b1z> b', 'E474:') ++ endfunc +*** ../vim-8.1.1354/src/testdir/test_json.vim 2019-04-12 21:19:01.265386241 +0200 +--- src/testdir/test_json.vim 2019-05-19 18:53:32.122127587 +0200 +*************** +*** 176,181 **** +--- 176,185 ---- + + call assert_fails('call json_decode("{{}:42}")', "E474:") + call assert_fails('call json_decode("{[]:42}")', "E474:") ++ ++ call assert_fails('call json_decode("\"\\u111Z\"")', 'E474:') ++ call assert_equal('[😂]', json_decode('"[\uD83D\uDE02]"')) ++ call assert_equal('a😂b', json_decode('"a\uD83D\uDE02b"')) + endfunc + + let s:jsl5 = '[7,,,]' +*** ../vim-8.1.1354/src/version.c 2019-05-19 18:41:23.262148495 +0200 +--- src/version.c 2019-05-19 18:56:01.189060580 +0200 +*************** +*** 769,770 **** +--- 769,772 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1355, + /**/ + +-- +Bad fashion can discourage normal people from interacting with the engineer +and talking about the cute things their children do. + (Scott Adams - The Dilbert principle) + + /// 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 /// |