Fix bad lookbehind compilation when preceded by a DEFINE group.

This commit is contained in:
ph10 2020-02-24 17:29:00 +00:00
parent f8e8663552
commit 9c83f0f8c3
4 changed files with 17 additions and 0 deletions

View File

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

View File

@ -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
View File

@ -6424,4 +6424,7 @@ ef) x/x,mark
"(?<=X(?(DEFINE)(Y))(?1))."
AXYZ
"(?(DEFINE)(?<foo>bar))(?<![-a-z0-9])word"
word
# End of testinput1

View File

@ -10182,4 +10182,8 @@ No match
AXYZ
0: Z
"(?(DEFINE)(?<foo>bar))(?<![-a-z0-9])word"
word
0: word
# End of testinput1