Fix anchoring bug in conditionals with only one branch.
This commit is contained in:
parent
50f0de6015
commit
59c2175ed9
|
@ -174,6 +174,11 @@ not used in PCRE2.
|
||||||
from distribution tarballs, owing to a typo in Makefile.am which had
|
from distribution tarballs, owing to a typo in Makefile.am which had
|
||||||
testoutput8-16-3 twice. Now fixed.
|
testoutput8-16-3 twice. Now fixed.
|
||||||
|
|
||||||
|
39. If the only branch in a conditional subpattern was anchored, the whole
|
||||||
|
subpattern was treated as anchored, when it should not have been, since the
|
||||||
|
assumed empty second branch cannot be anchored. Demonstrated by test patterns
|
||||||
|
such as /(?(1)^())b/ or /(?(?=^))b/.
|
||||||
|
|
||||||
|
|
||||||
Version 10.31 12-February-2018
|
Version 10.31 12-February-2018
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
|
@ -1454,8 +1454,8 @@ else if ((i = escapes[c - ESCAPES_FIRST]) != 0)
|
||||||
/* \N{U+ can be handled by the \x{ code. However, this construction is
|
/* \N{U+ can be handled by the \x{ code. However, this construction is
|
||||||
not valid in EBCDIC environments because it specifies a Unicode
|
not valid in EBCDIC environments because it specifies a Unicode
|
||||||
character, not a codepoint in the local code. For example \N{U+0041}
|
character, not a codepoint in the local code. For example \N{U+0041}
|
||||||
must be "A" in all environments. Also, in Perl, \N{U+ forces Unicode
|
must be "A" in all environments. Also, in Perl, \N{U+ forces Unicode
|
||||||
casing semantics for the entire pattern, so allow it only in UTF (i.e.
|
casing semantics for the entire pattern, so allow it only in UTF (i.e.
|
||||||
Unicode) mode. */
|
Unicode) mode. */
|
||||||
|
|
||||||
if (ptrend - p > 1 && *p == CHAR_U && p[1] == CHAR_PLUS)
|
if (ptrend - p > 1 && *p == CHAR_U && p[1] == CHAR_PLUS)
|
||||||
|
@ -1464,12 +1464,12 @@ else if ((i = escapes[c - ESCAPES_FIRST]) != 0)
|
||||||
*errorcodeptr = ERR93;
|
*errorcodeptr = ERR93;
|
||||||
#else
|
#else
|
||||||
if (utf)
|
if (utf)
|
||||||
{
|
{
|
||||||
ptr = p + 1;
|
ptr = p + 1;
|
||||||
escape = 0; /* Not a fancy escape after all */
|
escape = 0; /* Not a fancy escape after all */
|
||||||
goto COME_FROM_NU;
|
goto COME_FROM_NU;
|
||||||
}
|
}
|
||||||
else *errorcodeptr = ERR93;
|
else *errorcodeptr = ERR93;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7864,10 +7864,11 @@ do {
|
||||||
if (!is_anchored(scode, bracket_map, cb, atomcount, TRUE)) return FALSE;
|
if (!is_anchored(scode, bracket_map, cb, atomcount, TRUE)) return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Condition */
|
/* Condition. If there is no second branch, it can't be anchored. */
|
||||||
|
|
||||||
else if (op == OP_COND)
|
else if (op == OP_COND)
|
||||||
{
|
{
|
||||||
|
if (scode[GET(scode,1)] != OP_ALT) return FALSE;
|
||||||
if (!is_anchored(scode, bracket_map, cb, atomcount, inassert))
|
if (!is_anchored(scode, bracket_map, cb, atomcount, inassert))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5459,4 +5459,19 @@ a)"xI
|
||||||
|
|
||||||
/(?x-i-i)/
|
/(?x-i-i)/
|
||||||
|
|
||||||
|
/(?(?=^))b/I
|
||||||
|
abc
|
||||||
|
|
||||||
|
/(?(?=^)|)b/I
|
||||||
|
abc
|
||||||
|
|
||||||
|
/(?(?=^)|^)b/I
|
||||||
|
bbc
|
||||||
|
\= Expect no match
|
||||||
|
abc
|
||||||
|
|
||||||
|
/(?(1)^|^())/I
|
||||||
|
|
||||||
|
/(?(1)^())b/I
|
||||||
|
|
||||||
# End of testinput2
|
# End of testinput2
|
||||||
|
|
|
@ -16631,6 +16631,46 @@ Failed: error 194 at offset 3: invalid hyphen in option setting
|
||||||
/(?x-i-i)/
|
/(?x-i-i)/
|
||||||
Failed: error 194 at offset 5: invalid hyphen in option setting
|
Failed: error 194 at offset 5: invalid hyphen in option setting
|
||||||
|
|
||||||
|
/(?(?=^))b/I
|
||||||
|
Capturing subpattern count = 0
|
||||||
|
Last code unit = 'b'
|
||||||
|
Subject length lower bound = 1
|
||||||
|
abc
|
||||||
|
0: b
|
||||||
|
|
||||||
|
/(?(?=^)|)b/I
|
||||||
|
Capturing subpattern count = 0
|
||||||
|
First code unit = 'b'
|
||||||
|
Subject length lower bound = 1
|
||||||
|
abc
|
||||||
|
0: b
|
||||||
|
|
||||||
|
/(?(?=^)|^)b/I
|
||||||
|
Capturing subpattern count = 0
|
||||||
|
Compile options: <none>
|
||||||
|
Overall options: anchored
|
||||||
|
First code unit = 'b'
|
||||||
|
Subject length lower bound = 1
|
||||||
|
bbc
|
||||||
|
0: b
|
||||||
|
\= Expect no match
|
||||||
|
abc
|
||||||
|
No match
|
||||||
|
|
||||||
|
/(?(1)^|^())/I
|
||||||
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
|
May match empty string
|
||||||
|
Compile options: <none>
|
||||||
|
Overall options: anchored
|
||||||
|
Subject length lower bound = 0
|
||||||
|
|
||||||
|
/(?(1)^())b/I
|
||||||
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
|
Last code unit = 'b'
|
||||||
|
Subject length lower bound = 1
|
||||||
|
|
||||||
# End of testinput2
|
# End of testinput2
|
||||||
Error -70: PCRE2_ERROR_BADDATA (unknown error number)
|
Error -70: PCRE2_ERROR_BADDATA (unknown error number)
|
||||||
Error -62: bad serialized data
|
Error -62: bad serialized data
|
||||||
|
|
Loading…
Reference in New Issue