summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--src/pcre2_compile.c5
-rw-r--r--testdata/testinput13
-rw-r--r--testdata/testoutput14
4 files changed, 17 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 9f493be..95e0123 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
------------------------------
diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c
index 515f2aa..13769a0 100644
--- a/src/pcre2_compile.c
+++ b/src/pcre2_compile.c
@@ -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:
diff --git a/testdata/testinput1 b/testdata/testinput1
index c6b3647..8d952e2 100644
--- a/testdata/testinput1
+++ b/testdata/testinput1
@@ -6424,4 +6424,7 @@ ef) x/x,mark
"(?<=X(?(DEFINE)(Y))(?1))."
AXYZ
+"(?(DEFINE)(?<foo>bar))(?<![-a-z0-9])word"
+ word
+
# End of testinput1
diff --git a/testdata/testoutput1 b/testdata/testoutput1
index 4c43caa..470e412 100644
--- a/testdata/testoutput1
+++ b/testdata/testoutput1
@@ -10182,4 +10182,8 @@ No match
AXYZ
0: Z
+"(?(DEFINE)(?<foo>bar))(?<![-a-z0-9])word"
+ word
+ 0: word
+
# End of testinput1