This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #72998] regex looping
authorKarl Williamson <khw@khw-desktop.(none)>
Wed, 14 Apr 2010 03:25:36 +0000 (21:25 -0600)
committerRafael Garcia-Suarez <rgs@consttype.org>
Thu, 15 Apr 2010 08:30:52 +0000 (10:30 +0200)
commit7dcb3b25fc4113f0eeb68d0d3c47ccedd5ff3f2a
tree32735be6d32f1eb0c931d46a202b2a555b8c4f13
parentcfbab81b96edaf7de871d0fa306f1723e15a56d7
PATCH: [perl #72998] regex looping

If a character folds to multiple ones in case-insensitive matching,
it should not match just one of those, or the regular expression can
loop.  For example, \N{LATIN SMALL LIGATURE FF} folds to 'ff', and so
    "\N{LATIN SMALL LIGATURE FF}" =~ /f+/i
should match.  Prior to this patch, this function returned that there is
a match, but left the matching string  pointer at the beginning of the
"\N{LATIN SMALL LIGATURE FF}" because it doesn't make sense to match
just half a character, and at this level it doesn't know about the '+'.
This leaves things in an inconsistent state, with the reporting of a
match, but the input pointer unchanged, the result of which is a loop.

I don't know how to fix this so that it correctly matches, and there are
semantic issues with doing so.  For example, if
    "\N{LATIN SMALL LIGATURE FF}" =~ /ff/i
matches, then one would think that so should
    "\N{LATIN SMALL LIGATURE FF}" =~ /(f)(f)/i
But $1 and $2 don't really make sense here, since they both refer to the
half of the same character.

So this patch just returns failure if only a partial character is
matched.  That leaves things consistent, and solves the problem of
looping, so that Perl doesn't hang on such a construct, but leaves the
ultimate solution for another day.
t/re/re.t
utf8.c