diff options
Diffstat (limited to 'backport-Remove-incorrect-optimization-in-DFA-matching-when-p.patch')
-rw-r--r-- | backport-Remove-incorrect-optimization-in-DFA-matching-when-p.patch | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/backport-Remove-incorrect-optimization-in-DFA-matching-when-p.patch b/backport-Remove-incorrect-optimization-in-DFA-matching-when-p.patch new file mode 100644 index 0000000..7d0382e --- /dev/null +++ b/backport-Remove-incorrect-optimization-in-DFA-matching-when-p.patch @@ -0,0 +1,118 @@ +From 674b6640e702705e8e90125f972197fae3aa364d Mon Sep 17 00:00:00 2001 +From: Philip Hazel <Philip.Hazel@gmail.com> +Date: Sat, 3 Aug 2024 17:18:56 +0100 +Subject: [PATCH] Remove incorrect optimization in DFA matching when partial + matching and (*F) are involved + +Conflict:don't modify ChangeLog; adapt context +Reference:https://github.com/PCRE2Project/pcre2/commit/674b6640e702705e8e90125f972197fae3aa364d + +--- + src/pcre2_dfa_match.c | 10 +--------- + testdata/testinput6 | 9 +++++++++ + testdata/testoutput6 | 13 +++++++++++++ + 3 files changed, 23 insertions(+), 9 deletions(-) + +diff --git a/src/pcre2_dfa_match.c b/src/pcre2_dfa_match.c +index 60f6b4f..1c4495f 100644 +--- a/src/pcre2_dfa_match.c ++++ b/src/pcre2_dfa_match.c +@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Original API code Copyright (c) 1997-2012 University of Cambridge +- New API code Copyright (c) 2016-2023 University of Cambridge ++ New API code Copyright (c) 2016-2024 University of Cambridge + + ----------------------------------------------------------------------------- + Redistribution and use in source and binary forms, with or without +@@ -693,7 +693,6 @@ for (;;) + int i, j; + int clen, dlen; + uint32_t c, d; +- int forced_fail = 0; + BOOL partial_newline = FALSE; + BOOL could_continue = reset_could_continue; + reset_could_continue = FALSE; +@@ -2765,7 +2764,6 @@ for (;;) + though the other "backtracking verbs" are not supported. */ + + case OP_FAIL: +- forced_fail++; /* Count FAILs for multiple states */ + break; + + case OP_ASSERT: +@@ -3247,18 +3245,12 @@ for (;;) + matches that we are going to find. If partial matching has been requested, + check for appropriate conditions. + +- The "forced_ fail" variable counts the number of (*F) encountered for the +- character. If it is equal to the original active_count (saved in +- workspace[1]) it means that (*F) was found on every active state. In this +- case we don't want to give a partial match. +- + The "could_continue" variable is true if a state could have continued but + for the fact that the end of the subject was reached. */ + + if (new_count <= 0) + { + if (could_continue && /* Some could go on, and */ +- forced_fail != workspace[1] && /* Not all forced fail & */ + ( /* either... */ + (mb->moptions & PCRE2_PARTIAL_HARD) != 0 /* Hard partial */ + || /* or... */ +diff --git a/testdata/testinput6 b/testdata/testinput6 +index 0ca0d23..b71a69c 100644 +--- a/testdata/testinput6 ++++ b/testdata/testinput6 +@@ -4392,9 +4392,18 @@ + + /Z(*F)Q|ZXY/ + Z\=ps ++ XY\=dfa_restart + \= Expect no match + ZA\=ps + X\=ps ++ ++/Z(?:(*F)Q|XY)/ ++ Z\=ps ++ XY\=dfa_restart ++ ++/Z(*F)Q|Z(*F)XY/ ++\= Expect no match ++ Z\=ps + + /\bthe cat\b/ + the cat\=ps +diff --git a/testdata/testoutput6 b/testdata/testoutput6 +index 607b572..38c653e 100644 +--- a/testdata/testoutput6 ++++ b/testdata/testoutput6 +@@ -6769,11 +6769,24 @@ Partial match: dogs + /Z(*F)Q|ZXY/ + Z\=ps + Partial match: Z ++ XY\=dfa_restart ++ 0: XY + \= Expect no match + ZA\=ps + No match + X\=ps + No match ++ ++/Z(?:(*F)Q|XY)/ ++ Z\=ps ++Partial match: Z ++ XY\=dfa_restart ++ 0: XY ++ ++/Z(*F)Q|Z(*F)XY/ ++\= Expect no match ++ Z\=ps ++No match + + /\bthe cat\b/ + the cat\=ps +-- +2.43.0 + |