comparison src/regexp_nfa.c @ 15802:f043c8931585 v8.1.0908

patch 8.1.0908: can't handle large value for %{nr}v in regexp commit https://github.com/vim/vim/commit/9403a2168db82b7de80f792984084bb3f00e2263 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Feb 13 18:35:06 2019 +0100 patch 8.1.0908: can't handle large value for %{nr}v in regexp Problem: Can't handle large value for %{nr}v in regexp. (Kuang-che Wu) Solution: Give an error if the value is too large. (closes https://github.com/vim/vim/issues/3948)
author Bram Moolenaar <Bram@vim.org>
date Wed, 13 Feb 2019 18:45:06 +0100
parents 483fda269100
children 6a4e9d9f1d66
comparison
equal deleted inserted replaced
15801:669a52a4f948 15802:f043c8931585
1548 n = n * 10 + (c - '0'); 1548 n = n * 10 + (c - '0');
1549 c = getchr(); 1549 c = getchr();
1550 } 1550 }
1551 if (c == 'l' || c == 'c' || c == 'v') 1551 if (c == 'l' || c == 'c' || c == 'v')
1552 { 1552 {
1553 int limit = INT_MAX;
1554
1553 if (c == 'l') 1555 if (c == 'l')
1554 { 1556 {
1555 /* \%{n}l \%{n}<l \%{n}>l */ 1557 /* \%{n}l \%{n}<l \%{n}>l */
1556 EMIT(cmp == '<' ? NFA_LNUM_LT : 1558 EMIT(cmp == '<' ? NFA_LNUM_LT :
1557 cmp == '>' ? NFA_LNUM_GT : NFA_LNUM); 1559 cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
1561 else if (c == 'c') 1563 else if (c == 'c')
1562 /* \%{n}c \%{n}<c \%{n}>c */ 1564 /* \%{n}c \%{n}<c \%{n}>c */
1563 EMIT(cmp == '<' ? NFA_COL_LT : 1565 EMIT(cmp == '<' ? NFA_COL_LT :
1564 cmp == '>' ? NFA_COL_GT : NFA_COL); 1566 cmp == '>' ? NFA_COL_GT : NFA_COL);
1565 else 1567 else
1568 {
1566 /* \%{n}v \%{n}<v \%{n}>v */ 1569 /* \%{n}v \%{n}<v \%{n}>v */
1567 EMIT(cmp == '<' ? NFA_VCOL_LT : 1570 EMIT(cmp == '<' ? NFA_VCOL_LT :
1568 cmp == '>' ? NFA_VCOL_GT : NFA_VCOL); 1571 cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
1569 #if VIM_SIZEOF_INT < VIM_SIZEOF_LONG 1572 limit = INT_MAX / MB_MAXBYTES;
1570 if (n > INT_MAX) 1573 }
1574 if (n >= limit)
1571 { 1575 {
1572 emsg(_("E951: \\% value too large")); 1576 emsg(_("E951: \\% value too large"));
1573 return FAIL; 1577 return FAIL;
1574 } 1578 }
1575 #endif
1576 EMIT((int)n); 1579 EMIT((int)n);
1577 break; 1580 break;
1578 } 1581 }
1579 else if (c == '\'' && n == 0) 1582 else if (c == '\'' && n == 0)
1580 { 1583 {