Fix bug in /xx implementation.

This commit is contained in:
Philip.Hazel 2017-07-25 15:27:30 +00:00
parent 464d03799f
commit 0ba5272960
3 changed files with 43 additions and 6 deletions

View File

@ -3535,8 +3535,12 @@ while (ptr < ptrend)
/* If x appears twice it sets the extended extended option. */ /* If x appears twice it sets the extended extended option. */
case CHAR_x: case CHAR_x:
*optset |= ((*optset & PCRE2_EXTENDED) != 0)? *optset |= PCRE2_EXTENDED;
PCRE2_EXTENDED_MORE : PCRE2_EXTENDED; if (ptr < ptrend && *ptr == CHAR_x)
{
*optset |= PCRE2_EXTENDED_MORE;
ptr++;
}
break; break;
default: default:
@ -3545,12 +3549,17 @@ while (ptr < ptrend)
goto FAILED; goto FAILED;
} }
} }
/* 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 ((set & (PCRE2_EXTENDED|PCRE2_EXTENDED_MORE)) == PCRE2_EXTENDED ||
(unset & PCRE2_EXTENDED) != 0)
unset |= PCRE2_EXTENDED_MORE;
options = (options | set) & (~unset); options = (options | set) & (~unset);
/* Unsetting extended should also get rid of extended-more. */
if ((options & PCRE2_EXTENDED) == 0) options &= ~PCRE2_EXTENDED_MORE;
/* If the options ended with ')' this is not the start of a nested /* If the options ended with ')' this is not the start of a nested
group with option changes, so the options change at this level. group with option changes, so the options change at this level.
In this case, if the previous level set up a nest block, discard the In this case, if the previous level set up a nest block, discard the

12
testdata/testinput1 vendored
View File

@ -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 # End of testinput1

16
testdata/testoutput1 vendored
View File

@ -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 # End of testinput1