Fix match_unset_backref bug.

This commit is contained in:
Philip.Hazel 2014-10-10 16:42:03 +00:00
parent 623b497851
commit d961132ae1
3 changed files with 18 additions and 8 deletions

View File

@ -2765,17 +2765,18 @@ for (;;)
/* Handle repeated back references. If a set group has length zero, just
continue with the main loop, because it matches however many times. For an
unset reference, in non-match-unset-backref mode, if the minimum is
zero, we can continue at the same level without recursion. For any other
minimum, carrying on will result in NOMATCH. */
unset reference, if the minimum is zero, we can also just continue. We an
also continue if PCRE2_MATCH_UNSET_BACKREF is set, because this makes unset
group be have as a zero-length group. For any other unset cases, carrying
on will result in NOMATCH. */
if (offset < offset_top && mb->ovector[offset] != PCRE2_UNSET)
{
if (mb->ovector[offset] == mb->ovector[offset + 1]) continue;
}
else
else /* Group is not set */
{
if (min == 0 && (mb->poptions & PCRE2_MATCH_UNSET_BACKREF) == 0)
if (min == 0 || (mb->poptions & PCRE2_MATCH_UNSET_BACKREF) != 0)
continue;
}
@ -2856,7 +2857,7 @@ for (;;)
eptr += slength;
}
/* If the length matched for each repetiaion is the same as the length of
/* If the length matched for each repetition is the same as the length of
the captured group, we can easily work backwards. This is the normal
case. However, in caseless UTF-8 mode there are pairs of case-equivalent
characters whose lengths (in terms of code units) differ. However, this

3
testdata/testinput2 vendored
View File

@ -4003,4 +4003,7 @@ a random value. /Ix
abd
xyd
/\k<A>*(?<A>aa)(?<A>bb)/match_unset_backref,dupnames
aabb
# End of testinput2

View File

@ -13576,4 +13576,10 @@ Subject length lower bound = 0
xyd
0: d
/\k<A>*(?<A>aa)(?<A>bb)/match_unset_backref,dupnames
aabb
0: aabb
1: aa
2: bb
# End of testinput2