From 13540207b0be750832435f4ebe2fa60a9ced3671 Mon Sep 17 00:00:00 2001 From: zherczeg Date: Fri, 6 Mar 2020 09:23:10 +0000 Subject: [PATCH] Fix issues in the early fail optimization. --- src/pcre2_jit_compile.c | 56 ++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/pcre2_jit_compile.c b/src/pcre2_jit_compile.c index a3efbcd..344fa84 100644 --- a/src/pcre2_jit_compile.c +++ b/src/pcre2_jit_compile.c @@ -1285,13 +1285,19 @@ do case OP_ANY: case OP_ALLANY: case OP_ANYBYTE: - case OP_ANYNL: case OP_NOT_HSPACE: case OP_HSPACE: case OP_NOT_VSPACE: case OP_VSPACE: + fast_forward_allowed = FALSE; + cc++; + continue; + + case OP_ANYNL: case OP_EXTUNI: fast_forward_allowed = FALSE; + if (count == 0) + count = 1; cc++; continue; @@ -1337,6 +1343,7 @@ do case OP_TYPEEXACT: case OP_TYPEPOSUPTO: cc += IMM2_SIZE; + /* Fall through */ case OP_TYPEQUERY: case OP_TYPEMINQUERY: @@ -1399,6 +1406,7 @@ do case OP_NOTEXACTI: case OP_NOTPOSUPTOI: cc += IMM2_SIZE; + /* Fall through */ case OP_QUERY: case OP_MINQUERY: @@ -1425,27 +1433,41 @@ do case OP_NCLASS: #if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8 case OP_XCLASS: - end = cc + ((*cc == OP_XCLASS) ? GET(cc, 1) : (unsigned int)(1 + (32 / sizeof(PCRE2_UCHAR)))); + accelerated_start = cc; + cc += ((*cc == OP_XCLASS) ? GET(cc, 1) : (unsigned int)(1 + (32 / sizeof(PCRE2_UCHAR)))); #else - end = cc + (1 + (32 / sizeof(PCRE2_UCHAR))); + accelerated_start = cc; + cc += (1 + (32 / sizeof(PCRE2_UCHAR))); #endif - if ((*end >= OP_CRSTAR && *end <= OP_CRMINPLUS) || (*end >= OP_CRPOSSTAR && *end <= OP_CRPOSPLUS)) + switch (*cc) { - accelerated_start = cc; - cc = end + 1; + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + cc++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + cc += 2 * IMM2_SIZE; + /* Fall through */ + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSQUERY: + cc++; + if (count == 0) + count = 1; + /* Fall through */ + default: + accelerated_start = NULL; + fast_forward_allowed = FALSE; break; } - - fast_forward_allowed = FALSE; - if (count == 0) - count = 1; - - cc = end; - if (*end == OP_CRQUERY || *end == OP_CRMINQUERY || *end == OP_CRPOSQUERY) - cc++; - else if (*end == OP_CRRANGE || *end == OP_CRMINRANGE || *end == OP_CRPOSRANGE) - cc += 1 + 2 * IMM2_SIZE; continue; case OP_ONCE: @@ -1505,7 +1527,7 @@ do common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip; *private_data_start += sizeof(sljit_sw); } - else + else { common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_fail;