This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix string corruption with (??{}) and PERL_NO_COW
authorFather Chrysostomos <sprout@cpan.org>
Fri, 20 Dec 2013 06:06:47 +0000 (22:06 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 20 Dec 2013 06:06:57 +0000 (22:06 -0800)
commit4cba5ac0e07b709d489a2aaedf4c007712a09e51
treea980a36d1812d4c8bf71e609bdf50774114df548
parent49143bdc2f098cbb6c3513be408d13f261a699c1
Fix string corruption with (??{}) and PERL_NO_COW

Commit 9ffd39ab75, which allowed PADTMPs’ string buffers to be stolen,
caused "$a$b" =~ /(??{})/ to cause string corruption with match varia-
bles on some systems, because the buffer from "$a$b"’s return value
was being stolen when ‘copied’ into a new $_ for the code block.

The string copy necessary for $& and $1 to work would happen only
after the code block’s $_ had been freed, and consequently after the
string buffer had been freed.

Whether this would cause observable buggy behaviour (as opposed to
things only memory tools like valgrind would catch) depended on
whether the malloc implementation would modify the string immediately
when freeing it.

Dave Mitchell observed in <20131218113448.GN2490@iabyn.com> that tests
were failing under -DPERL_NO_COW.  The added test will also fail (for
me at least) under copy-on-write, because the string is long enough to
favour swiping the buffer.  (It happens for me only on Linux, not Dar-
win, incidentally.)

Copying the string with _nosteal fixes the problem.
regexec.c
t/re/pat_re_eval.t