Fix bad lookbehind compilation when preceded by a DEFINE group.
This commit is contained in:
parent
f8e8663552
commit
9c83f0f8c3
@ -77,6 +77,11 @@ low surrogate. This caused incorrect behaviour, for example when
|
||||
PCRE2_MATCH_INVALID_UTF was set and a match started immediately following the
|
||||
invalid high surrogate, such as /aa/ matching "\x{d800}aa".
|
||||
|
||||
20. If a DEFINE group immediately preceded a lookbehind assertion, the pattern
|
||||
could be mis-compiled and therefore not match correctly. This is the example
|
||||
that found this: /(?(DEFINE)(?<foo>bar))(?<![-a-z0-9])word/ which failed to
|
||||
match "word" because the "move back" value was set to zero.
|
||||
|
||||
|
||||
Version 10.34 21-November-2019
|
||||
------------------------------
|
||||
|
@ -8019,6 +8019,7 @@ and skip over the pattern offset. */
|
||||
lookbehind = *code == OP_ASSERTBACK ||
|
||||
*code == OP_ASSERTBACK_NOT ||
|
||||
*code == OP_ASSERTBACK_NA;
|
||||
|
||||
if (lookbehind)
|
||||
{
|
||||
lookbehindlength = META_DATA(pptr[-1]);
|
||||
@ -9553,6 +9554,10 @@ for (; *pptr != META_END; pptr++)
|
||||
break;
|
||||
|
||||
case META_COND_DEFINE:
|
||||
pptr += SIZEOFFSET;
|
||||
nestlevel++;
|
||||
break;
|
||||
|
||||
case META_COND_NAME:
|
||||
case META_COND_NUMBER:
|
||||
case META_COND_RNAME:
|
||||
|
3
testdata/testinput1
vendored
3
testdata/testinput1
vendored
@ -6424,4 +6424,7 @@ ef) x/x,mark
|
||||
"(?<=X(?(DEFINE)(Y))(?1))."
|
||||
AXYZ
|
||||
|
||||
"(?(DEFINE)(?<foo>bar))(?<![-a-z0-9])word"
|
||||
word
|
||||
|
||||
# End of testinput1
|
||||
|
4
testdata/testoutput1
vendored
4
testdata/testoutput1
vendored
@ -10182,4 +10182,8 @@ No match
|
||||
AXYZ
|
||||
0: Z
|
||||
|
||||
"(?(DEFINE)(?<foo>bar))(?<![-a-z0-9])word"
|
||||
word
|
||||
0: word
|
||||
|
||||
# End of testinput1
|
||||
|
Loading…
Reference in New Issue
Block a user