Forbid \K patterns that end before they start in pcre2_substitute().

This commit is contained in:
Philip.Hazel 2015-11-03 17:38:00 +00:00
parent 75181cca2e
commit 2caf22dc61
8 changed files with 49 additions and 25 deletions

View File

@ -257,6 +257,9 @@ as /(?<=(a)(?-1))x/ which have a recursion within a backreference.
74. Give an error if a lookbehind assertion is longer than 65535 code units. 74. Give an error if a lookbehind assertion is longer than 65535 code units.
75. Give an error in pcre2_substitute() if a match ends before it starts (as a
result of the use of \K).
Version 10.20 30-June-2015 Version 10.20 30-June-2015
-------------------------- --------------------------

View File

@ -1,4 +1,4 @@
.TH PCRE2API 3 "16 October 2015" "PCRE2 10.21" .TH PCRE2API 3 "03 November 2015" "PCRE2 10.21"
.SH NAME .SH NAME
PCRE2 - Perl-compatible regular expressions (revised API) PCRE2 - Perl-compatible regular expressions (revised API)
.sp .sp
@ -2666,7 +2666,9 @@ same number causes an error at compile time.
This function calls \fBpcre2_match()\fP and then makes a copy of the subject This function calls \fBpcre2_match()\fP and then makes a copy of the subject
string in \fIoutputbuffer\fP, replacing the part that was matched with the string in \fIoutputbuffer\fP, replacing the part that was matched with the
\fIreplacement\fP string, whose length is supplied in \fBrlength\fP. This can \fIreplacement\fP string, whose length is supplied in \fBrlength\fP. This can
be given as PCRE2_ZERO_TERMINATED for a zero-terminated string. be given as PCRE2_ZERO_TERMINATED for a zero-terminated string. Matches in
which a \eK item in a lookahead in the pattern causes the match to end before
it starts are not supported, and give rise to an error return.
.P .P
The first seven arguments of \fBpcre2_substitute()\fP are the same as for The first seven arguments of \fBpcre2_substitute()\fP are the same as for
\fBpcre2_match()\fP, except that the partial matching options are not \fBpcre2_match()\fP, except that the partial matching options are not
@ -2769,8 +2771,9 @@ are passed straight back. PCRE2_ERROR_NOMEMORY is returned if the output buffer
is not big enough. PCRE2_ERROR_BADREPLACEMENT is used for miscellaneous syntax is not big enough. PCRE2_ERROR_BADREPLACEMENT is used for miscellaneous syntax
errors in the replacement string, with more particular errors being errors in the replacement string, with more particular errors being
PCRE2_ERROR_BADREPESCAPE (invalid escape sequence), PCRE2_ERROR_BADREPESCAPE (invalid escape sequence),
PCRE2_ERROR_REPMISSING_BRACE (closing curly bracket not found), and PCRE2_ERROR_REPMISSING_BRACE (closing curly bracket not found),
PCRE2_BADSUBSTITUTION (syntax error in extended group substitution). As for all PCRE2_BADSUBSTITUTION (syntax error in extended group substitution), and
PCRE2_BADSUBPATTERN (the pattern match ended before it started). As for all
PCRE2 errors, a text message that describes the error can be obtained by PCRE2 errors, a text message that describes the error can be obtained by
calling \fBpcre2_get_error_message()\fP. calling \fBpcre2_get_error_message()\fP.
. .
@ -3066,6 +3069,6 @@ Cambridge, England.
.rs .rs
.sp .sp
.nf .nf
Last updated: 16 October 2015 Last updated: 03 November 2015
Copyright (c) 1997-2015 University of Cambridge. Copyright (c) 1997-2015 University of Cambridge.
.fi .fi

View File

@ -240,6 +240,7 @@ numbers must not be changed. */
#define PCRE2_ERROR_BADREPESCAPE (-57) #define PCRE2_ERROR_BADREPESCAPE (-57)
#define PCRE2_ERROR_REPMISSINGBRACE (-58) #define PCRE2_ERROR_REPMISSINGBRACE (-58)
#define PCRE2_ERROR_BADSUBSTITUTION (-59) #define PCRE2_ERROR_BADSUBSTITUTION (-59)
#define PCRE2_ERROR_BADSUBSPATTERN (-60)
/* Request types for pcre2_pattern_info() */ /* Request types for pcre2_pattern_info() */

View File

@ -240,6 +240,7 @@ numbers must not be changed. */
#define PCRE2_ERROR_BADREPESCAPE (-57) #define PCRE2_ERROR_BADREPESCAPE (-57)
#define PCRE2_ERROR_REPMISSINGBRACE (-58) #define PCRE2_ERROR_REPMISSINGBRACE (-58)
#define PCRE2_ERROR_BADSUBSTITUTION (-59) #define PCRE2_ERROR_BADSUBSTITUTION (-59)
#define PCRE2_ERROR_BADSUBSPATTERN (-60)
/* Request types for pcre2_pattern_info() */ /* Request types for pcre2_pattern_info() */

View File

@ -248,6 +248,8 @@ static const char match_error_texts[] =
"bad escape sequence in replacement string\0" "bad escape sequence in replacement string\0"
"expected closing curly bracket in replacement string\0" "expected closing curly bracket in replacement string\0"
"bad substitution in replacement string\0" "bad substitution in replacement string\0"
/* 60 */
"match with end before start is not supported\0"
; ;

View File

@ -320,7 +320,14 @@ do
continue; continue;
} }
/* Handle a successful match. */ /* Handle a successful match. Matches that use \K to end before they start
are not supported. */
if (ovector[1] < ovector[0])
{
rc = PCRE2_ERROR_BADSUBSPATTERN;
goto EXIT;
}
subs++; subs++;
if (rc == 0) rc = ovector_count; if (rc == 0) rc = ovector_count;

3
testdata/testinput2 vendored
View File

@ -4596,4 +4596,7 @@ B)x/alt_verbnames,mark
/(?<!a{65535})x/I /(?<!a{65535})x/I
/(?=a\K)/replace=z
BaCaD
# End of testinput2 # End of testinput2

View File

@ -14690,4 +14690,8 @@ Max lookbehind = 65535
First code unit = 'x' First code unit = 'x'
Subject length lower bound = 1 Subject length lower bound = 1
/(?=a\K)/replace=z
BaCaD
Failed: error -60: match with end before start is not supported
# End of testinput2 # End of testinput2