summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorph10 <ph10@6239d852-aaf2-0410-a92c-79f79f948069>2017-07-25 15:27:30 +0000
committerph10 <ph10@6239d852-aaf2-0410-a92c-79f79f948069>2017-07-25 15:27:30 +0000
commit7511f7fe27af8e5a8e56be790b5bdb9a56475f12 (patch)
tree74d65e5bdc24998baefbd932a8e768465d104287
parent811cdcf78d9bab7d8309accc68b70f315e1193b2 (diff)
downloadpcre2-7511f7fe27af8e5a8e56be790b5bdb9a56475f12.tar.gz
Fix bug in /xx implementation.
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@848 6239d852-aaf2-0410-a92c-79f79f948069
-rw-r--r--src/pcre2_compile.c19
-rw-r--r--testdata/testinput112
-rw-r--r--testdata/testoutput116
3 files changed, 42 insertions, 5 deletions
diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c
index c4aa14e..8368b39 100644
--- a/src/pcre2_compile.c
+++ b/src/pcre2_compile.c
@@ -3535,8 +3535,12 @@ while (ptr < ptrend)
/* If x appears twice it sets the extended extended option. */
case CHAR_x:
- *optset |= ((*optset & PCRE2_EXTENDED) != 0)?
- PCRE2_EXTENDED_MORE : PCRE2_EXTENDED;
+ *optset |= PCRE2_EXTENDED;
+ if (ptr < ptrend && *ptr == CHAR_x)
+ {
+ *optset |= PCRE2_EXTENDED_MORE;
+ ptr++;
+ }
break;
default:
@@ -3545,11 +3549,16 @@ while (ptr < ptrend)
goto FAILED;
}
}
- options = (options | set) & (~unset);
- /* Unsetting extended should also get rid of extended-more. */
+ /* If we are setting extended without extended-more, ensure that any
+ existing extended-more gets unset. Also, unsetting extended must also
+ unset extended-more. */
- if ((options & PCRE2_EXTENDED) == 0) options &= ~PCRE2_EXTENDED_MORE;
+ if ((set & (PCRE2_EXTENDED|PCRE2_EXTENDED_MORE)) == PCRE2_EXTENDED ||
+ (unset & PCRE2_EXTENDED) != 0)
+ unset |= PCRE2_EXTENDED_MORE;
+
+ options = (options | set) & (~unset);
/* If the options ended with ')' this is not the start of a nested
group with option changes, so the options change at this level.
diff --git a/testdata/testinput1 b/testdata/testinput1
index 8c76e21..24de5b0 100644
--- a/testdata/testinput1
+++ b/testdata/testinput1
@@ -6146,4 +6146,16 @@ ef) x/x,mark
# --------------------------------------------------------------------------
+/<(?x:[a b])>/xx
+ < >
+
+/<(?:[a b])>/xx
+ < >
+
+/<(?xxx:[a b])>/
+ < >
+
+/<(?-x:[a b])>/xx
+ < >
+
# End of testinput1
diff --git a/testdata/testoutput1 b/testdata/testoutput1
index 85c1aad..ca955f2 100644
--- a/testdata/testoutput1
+++ b/testdata/testoutput1
@@ -9739,4 +9739,20 @@ No match
# --------------------------------------------------------------------------
+/<(?x:[a b])>/xx
+ < >
+ 0: < >
+
+/<(?:[a b])>/xx
+ < >
+No match
+
+/<(?xxx:[a b])>/
+ < >
+No match
+
+/<(?-x:[a b])>/xx
+ < >
+ 0: < >
+
# End of testinput1