From 8ed58f1ae9e82a5c88c3960af38d5c96b191c554 Mon Sep 17 00:00:00 2001 From: ph10 Date: Mon, 2 Jul 2018 11:23:45 +0000 Subject: [PATCH] Ignore qualifiers on lookaheads within lookbehinds when checking for a fixed length. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@956 6239d852-aaf2-0410-a92c-79f79f948069 Petr Písař: Ported to 10.31. --- src/pcre2_compile.c | 26 ++++++++++++++++++++++++++ testdata/testinput1 | 10 ++++++++++ testdata/testinput2 | 2 ++ testdata/testoutput1 | 10 ++++++++++ testdata/testoutput2 | 14 ++++++++++++++ 6 files changed, 66 insertions(+) diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c index 0f75f36..5a47f1d 100644 --- a/src/pcre2_compile.c +++ b/src/pcre2_compile.c @@ -8572,6 +8572,32 @@ for (;; pptr++) case META_LOOKAHEADNOT: pptr = parsed_skip(pptr + 1, PSKIP_KET); if (pptr == NULL) goto PARSED_SKIP_FAILED; + + /* Also ignore any qualifiers that follow a lookahead assertion. */ + + switch (pptr[1]) + { + case META_ASTERISK: + case META_ASTERISK_PLUS: + case META_ASTERISK_QUERY: + case META_PLUS: + case META_PLUS_PLUS: + case META_PLUS_QUERY: + case META_QUERY: + case META_QUERY_PLUS: + case META_QUERY_QUERY: + pptr++; + break; + + case META_MINMAX: + case META_MINMAX_PLUS: + case META_MINMAX_QUERY: + pptr += 3; + break; + + default: + break; + } break; /* Lookbehinds can be ignored, but must themselves be checked. */ diff --git a/testdata/testinput1 b/testdata/testinput1 index fb50238..1b3191c 100644 --- a/testdata/testinput1 +++ b/testdata/testinput1 @@ -6192,4 +6192,14 @@ ef) x/x,mark /(?<=\G.)/g,aftertext abc +/(?<=(?=.)?)/ + +/(?<=(?=.)?+)/ + +/(?<=(?=.)*)/ + +/(?<=(?=.){4,5})/ + +/(?<=(?=.){4,5}x)/ + # End of testinput1 diff --git a/testdata/testinput2 b/testdata/testinput2 index 7e703d5..cc4b59b 100644 --- a/testdata/testinput2 +++ b/testdata/testinput2 @@ -5435,4 +5435,6 @@ a)"xI /(?=a+)a(a+)++b/B +/(?<=(?=.){4,5}x)/B + # End of testinput2 diff --git a/testdata/testoutput1 b/testdata/testoutput1 index 348dcbc..06469fa 100644 --- a/testdata/testoutput1 +++ b/testdata/testoutput1 @@ -9831,4 +9831,14 @@ No match 0: 0+ +/(?<=(?=.)?)/ + +/(?<=(?=.)?+)/ + +/(?<=(?=.)*)/ + +/(?<=(?=.){4,5})/ + +/(?<=(?=.){4,5}x)/ + # End of testinput1 diff --git a/testdata/testoutput2 b/testdata/testoutput2 index 9f504f6..aab0c94 100644 --- a/testdata/testoutput2 +++ b/testdata/testoutput2 @@ -16583,6 +16583,20 @@ No match End ------------------------------------------------------------------ +/(?<=(?=.){4,5}x)/B +------------------------------------------------------------------ + Bra + AssertB + Reverse + Assert + Any + Ket + x + Ket + Ket + End +------------------------------------------------------------------ + # End of testinput2 Error -70: PCRE2_ERROR_BADDATA (unknown error number) Error -62: bad serialized data -- 2.14.4