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.
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
--------------------------

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
PCRE2 - Perl-compatible regular expressions (revised API)
.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
string in \fIoutputbuffer\fP, replacing the part that was matched with the
\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
The first seven arguments of \fBpcre2_substitute()\fP are the same as for
\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
errors in the replacement string, with more particular errors being
PCRE2_ERROR_BADREPESCAPE (invalid escape sequence),
PCRE2_ERROR_REPMISSING_BRACE (closing curly bracket not found), and
PCRE2_BADSUBSTITUTION (syntax error in extended group substitution). As for all
PCRE2_ERROR_REPMISSING_BRACE (closing curly bracket not found),
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
calling \fBpcre2_get_error_message()\fP.
.
@ -3066,6 +3069,6 @@ Cambridge, England.
.rs
.sp
.nf
Last updated: 16 October 2015
Last updated: 03 November 2015
Copyright (c) 1997-2015 University of Cambridge.
.fi

View File

@ -240,6 +240,7 @@ numbers must not be changed. */
#define PCRE2_ERROR_BADREPESCAPE (-57)
#define PCRE2_ERROR_REPMISSINGBRACE (-58)
#define PCRE2_ERROR_BADSUBSTITUTION (-59)
#define PCRE2_ERROR_BADSUBSPATTERN (-60)
/* 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_REPMISSINGBRACE (-58)
#define PCRE2_ERROR_BADSUBSTITUTION (-59)
#define PCRE2_ERROR_BADSUBSPATTERN (-60)
/* 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"
"expected closing curly bracket 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;
}
/* 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++;
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\K)/replace=z
BaCaD
# End of testinput2

View File

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