From 4659c12ae044154d112aec32d9dcb2ee65db7357 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 15 Jul 2020 18:45:55 +0200 Subject: [PATCH] Fix #79846: 8c67c166996 broke simple regexp We backport the respective upstream fix[1]. [1] --- ext/pcre/pcre2lib/pcre2_jit_compile.c | 24 ++++++++++++------------ ext/pcre/tests/bug79846.phpt | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 ext/pcre/tests/bug79846.phpt diff --git a/ext/pcre/pcre2lib/pcre2_jit_compile.c b/ext/pcre/pcre2lib/pcre2_jit_compile.c index 33ad7e6553..8e51576ac6 100644 --- a/ext/pcre/pcre2lib/pcre2_jit_compile.c +++ b/ext/pcre/pcre2lib/pcre2_jit_compile.c @@ -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 index 0000000000..b995c38794 --- /dev/null +++ b/ext/pcre/tests/bug79846.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #79846 (8c67c166996 broke simple regexp) +--FILE-- + +--EXPECT-- +array(3) { + [0]=> + string(17) "component_phase_1" + [1]=> + string(15) "component_phase" + [2]=> + string(1) "1" +} -- 2.50.1