summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-07-20 18:56:06 +0200
committerBram Moolenaar <Bram@vim.org>2019-07-20 18:56:06 +0200
commit2a5b52758bb327b89d22660cc28c157ec29782e5 (patch)
tree47990749412bbb65ce8ec02c0580c10c0dd493f8
parent331bafd481fddfe542099d8cccd38d240c10c011 (diff)
downloadvim-git-2a5b52758bb327b89d22660cc28c157ec29782e5.tar.gz
patch 8.1.1720: crash with very long %[] patternv8.1.1720
Problem: Crash with very long %[] pattern. (Reza Mirzazade farkhani) Solution: Check for reg_toolong. (closes #4703)
-rw-r--r--src/regexp.c6
-rw-r--r--src/testdir/test_regexp_utf8.vim9
-rw-r--r--src/version.c2
3 files changed, 17 insertions, 0 deletions
diff --git a/src/regexp.c b/src/regexp.c
index 567604466..7d0ac6068 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -2175,7 +2175,11 @@ regatom(int *flagp)
if (ret == NULL)
ret = br;
else
+ {
regtail(lastnode, br);
+ if (reg_toolong)
+ return NULL;
+ }
ungetchr();
one_exactly = TRUE;
@@ -2200,6 +2204,8 @@ regatom(int *flagp)
if (OP(br) == BRANCH)
{
regtail(br, lastbranch);
+ if (reg_toolong)
+ return NULL;
br = OPERAND(br);
}
else
diff --git a/src/testdir/test_regexp_utf8.vim b/src/testdir/test_regexp_utf8.vim
index 98b9e73de..19ff882be 100644
--- a/src/testdir/test_regexp_utf8.vim
+++ b/src/testdir/test_regexp_utf8.vim
@@ -206,3 +206,12 @@ func Test_large_class()
call assert_equal(1, "\u3042" =~# '[\u3000-\u4000]')
set re=0
endfunc
+
+func Test_optmatch_toolong()
+ set re=1
+ " Can only handle about 8000 characters.
+ let pat = '\\%[' .. repeat('x', 9000) .. ']'
+ call assert_fails('call match("abc def", "' .. pat .. '")', 'E339:')
+ set re=0
+endfunc
+
diff --git a/src/version.c b/src/version.c
index 0de988723..756818629 100644
--- a/src/version.c
+++ b/src/version.c
@@ -778,6 +778,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1720,
+/**/
1719,
/**/
1718,