# HG changeset patch # User Bram Moolenaar # Date 1563642006 -7200 # Node ID f4ce361bb1e53d7b1341dab487550b74a8d07086 # Parent 613aced7fe575d3cb48bf42ab3401bd0b04a80d8 patch 8.1.1720: crash with very long %[] pattern commit https://github.com/vim/vim/commit/2a5b52758bb327b89d22660cc28c157ec29782e5 Author: Bram Moolenaar Date: Sat Jul 20 18:56:06 2019 +0200 patch 8.1.1720: crash with very long %[] pattern Problem: Crash with very long %[] pattern. (Reza Mirzazade farkhani) Solution: Check for reg_toolong. (closes https://github.com/vim/vim/issues/4703) diff --git a/src/regexp.c b/src/regexp.c --- 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 --- 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 --- 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,