]> granicus.if.org Git - php/commitdiff
Fix #79846: 8c67c166996 broke simple regexp
authorChristoph M. Becker <cmbecker69@gmx.de>
Wed, 15 Jul 2020 16:45:55 +0000 (18:45 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 16 Jul 2020 16:32:26 +0000 (18:32 +0200)
We backport the respective upstream fix[1].

[1] <https://vcs.pcre.org/pcre2?view=revision&revision=1267>

ext/pcre/pcre2lib/pcre2_jit_compile.c
ext/pcre/tests/bug79846.phpt [new file with mode: 0644]

index 33ad7e65537a12ed444107f6bec0ad4e910cd05f..8e51576ac68decb6b5deaef725732329c983d6c9 100644 (file)
@@ -1466,9 +1466,9 @@ do
         default:
         accelerated_start = NULL;
         fast_forward_allowed = FALSE;
-        break;
+        continue;
         }
-      continue;
+      break;
 
       case OP_ONCE:
       case OP_BRA:
@@ -1834,57 +1834,57 @@ while (cc < ccend)
     case OP_BRAZERO:
     case OP_BRAMINZERO:
     case OP_BRAPOSZERO:
-    repeat_check = FALSE;
     size = 1;
+    repeat_check = FALSE;
     break;
 
     CASE_ITERATOR_PRIVATE_DATA_1
-    space = 1;
     size = -2;
+    space = 1;
     break;
 
     CASE_ITERATOR_PRIVATE_DATA_2A
-    space = 2;
     size = -2;
+    space = 2;
     break;
 
     CASE_ITERATOR_PRIVATE_DATA_2B
-    space = 2;
     size = -(2 + IMM2_SIZE);
+    space = 2;
     break;
 
     CASE_ITERATOR_TYPE_PRIVATE_DATA_1
-    space = 1;
     size = 1;
+    space = 1;
     break;
 
     CASE_ITERATOR_TYPE_PRIVATE_DATA_2A
+    size = 1;
     if (cc[1] != OP_ANYNL && cc[1] != OP_EXTUNI)
       space = 2;
-    size = 1;
     break;
 
     case OP_TYPEUPTO:
+    size = 1 + IMM2_SIZE;
     if (cc[1 + IMM2_SIZE] != OP_ANYNL && cc[1 + IMM2_SIZE] != OP_EXTUNI)
       space = 2;
-    size = 1 + IMM2_SIZE;
     break;
 
     case OP_TYPEMINUPTO:
-    space = 2;
     size = 1 + IMM2_SIZE;
+    space = 2;
     break;
 
     case OP_CLASS:
     case OP_NCLASS:
-    space = get_class_iterator_size(cc + size);
     size = 1 + 32 / sizeof(PCRE2_UCHAR);
+    space = get_class_iterator_size(cc + size);
     break;
 
 #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
     case OP_XCLASS:
-    space = get_class_iterator_size(cc + size);
     size = GET(cc, 1);
+    space = get_class_iterator_size(cc + size);
     break;
 #endif
 
diff --git a/ext/pcre/tests/bug79846.phpt b/ext/pcre/tests/bug79846.phpt
new file mode 100644 (file)
index 0000000..b995c38
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Bug #79846 (8c67c166996 broke simple regexp)
+--FILE--
+<?php
+$item = "component_phase_1";
+preg_match("/([a-z]+_[a-z]+_*[a-z]+)_?(\d+)?/", $item, $match);
+var_dump($match);
+?>
+--EXPECT--
+array(3) {
+  [0]=>
+  string(17) "component_phase_1"
+  [1]=>
+  string(15) "component_phase"
+  [2]=>
+  string(1) "1"
+}