]> granicus.if.org Git - vim/commitdiff
patch 8.1.1720: crash with very long %[] pattern v8.1.1720
authorBram Moolenaar <Bram@vim.org>
Sat, 20 Jul 2019 16:56:06 +0000 (18:56 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 20 Jul 2019 16:56:06 +0000 (18:56 +0200)
Problem:    Crash with very long %[] pattern. (Reza Mirzazade farkhani)
Solution:   Check for reg_toolong. (closes #4703)

src/regexp.c
src/testdir/test_regexp_utf8.vim
src/version.c

index 56760446608f38e24e0a401b102657b9ba60298e..7d0ac60681ab00eda1ac51ed3ec74b4e5a0776ca 100644 (file)
@@ -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
index 98b9e73de603259a82e8af8b9b5493caac642bf5..19ff882be6c4486d38d9052c8fa373278a8f7d4e 100644 (file)
@@ -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
+
index 0de98872354c2f7cea2a3cf1251ae67c8feb94ed..756818629b1b67131531aa461c7d32bfc94fc102 100644 (file)
@@ -777,6 +777,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1720,
 /**/
     1719,
 /**/