summaryrefslogtreecommitdiff
path: root/backport-Remove-incorrect-optimization-in-DFA-matching-when-p.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-11-24 04:54:01 +0000
committerCoprDistGit <infra@openeuler.org>2024-11-24 04:54:01 +0000
commitfa531a873d206d6d1d1b5c6d9e9633b3fd0cfd9c (patch)
tree121fa70d44eb4032ba4e1c9ee7a961e0ea1dc0c3 /backport-Remove-incorrect-optimization-in-DFA-matching-when-p.patch
parent644e6a7b740d0a2366abd1fd5e50948db70ce87c (diff)
automatic import of pcre2openeuler24.03_LTS
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.patch118
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
+