From 51ec2c9893e7dac762b70033b85f55801b01176c Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Tue, 5 Oct 2021 16:40:57 +0000 Subject: [PATCH] Fix incorrect detection of alternatives in first character search. --- ChangeLog | 6 ++++++ src/pcre2_jit_compile.c | 9 ++++++--- src/pcre2_jit_test.c | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index e0ac9b3..05b317c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,12 @@ Change Log for PCRE2 -------------------- +Version 10.39-RC1 xx-xxx-2021 +----------------------------- + +1. Fix incorrect detection of alternatives in first character search. + + Version 10.38 01-October-2021 ----------------------------- diff --git a/src/pcre2_jit_compile.c b/src/pcre2_jit_compile.c index 495920d..2c61406 100644 --- a/src/pcre2_jit_compile.c +++ b/src/pcre2_jit_compile.c @@ -1251,10 +1251,13 @@ SLJIT_ASSERT(*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA); SLJIT_ASSERT(*cc != OP_CBRA || common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] != 0); SLJIT_ASSERT(start < EARLY_FAIL_ENHANCE_MAX); +next_alt = cc + GET(cc, 1); +if (*next_alt == OP_ALT) + fast_forward_allowed = FALSE; + do { count = start; - next_alt = cc + GET(cc, 1); cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0); while (TRUE) @@ -1512,7 +1515,7 @@ do { count++; - if (fast_forward_allowed && *next_alt == OP_KET) + if (fast_forward_allowed) { common->fast_forward_bc_ptr = accelerated_start; common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip; @@ -1562,8 +1565,8 @@ do else if (result < count) result = count; - fast_forward_allowed = FALSE; cc = next_alt; + next_alt = cc + GET(cc, 1); } while (*cc == OP_ALT); diff --git a/src/pcre2_jit_test.c b/src/pcre2_jit_test.c index f748016..8dee16e 100644 --- a/src/pcre2_jit_test.c +++ b/src/pcre2_jit_test.c @@ -352,6 +352,7 @@ static struct regression_test_case regression_test_cases[] = { { MU, A, 0, 0, ".[ab]?.", "xx" }, { MU, A, 0, 0, "_[ab]+_*a", "_aa" }, { MU, A, 0, 0, "#(A+)#\\d+", "#A#A#0" }, + { MU, A, 0, 0, "(?P\\d+)m|M", "4M" }, /* Bracket repeats with limit. */ { MU, A, 0, 0, "(?:(ab){2}){5}M", "abababababababababababM" },