Forbid \K patterns that end before they start in pcre2_substitute().
This commit is contained in:
parent
75181cca2e
commit
2caf22dc61
|
@ -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
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() */
|
||||||
|
|
||||||
|
|
|
@ -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() */
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue