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