This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
s///e on tainted utf8 strings got pos() messed up
authorDavid Mitchell <davem@iabyn.com>
Wed, 2 Jul 2014 16:13:45 +0000 (17:13 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 2 Jul 2014 16:22:52 +0000 (17:22 +0100)
commitcda67c9995c6d90b71a0939aaae084e1869b8248
tree98ca9311197c8f9d3673b1f21efb3acf04df2871
parente2303f682b76c6c494c11083756ee687fe98eaa9
s///e on tainted utf8 strings got pos() messed up

RT #122148: In 5.20, commit 25fdce4a165 changed the way pos() was stored
in magic attached to SVs from being a byte offset to a char offset,
*except* that, for efficiency, strings being used for pattern matching
were kept as byte offsets (with a flag indicating thus), *except* where
the SV already had magic attached (such as taint, as in the bug report and
in this commit's test), in which case it kept it as chars.

The code that updated pos() after an iteration of s///e was faulty: the
string buffer it used for converting byte legnths to char lengths (via
utf8_length()) was the wrong buffer: rather than using the src string
being matched against, it was using the destination string being built up
via iterations of s///. Once double-byte utf8 chars were involved, all the
pos() calculations went wrong, and utf8 warnings started mysteriously
appearing.
pp_ctl.c
t/op/utftaint.t