This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #127635] s///r with -DPERL_NO_COW attempts to modify source SV
authorTony Cook <tony@develop-help.com>
Mon, 29 Feb 2016 23:41:46 +0000 (10:41 +1100)
committerTony Cook <tony@develop-help.com>
Tue, 1 Mar 2016 03:55:40 +0000 (14:55 +1100)
commitd13a5d3bbfe4fc12e203547788c811cb8320ca43
treef7db659cf4fb4b3b616673e2fb6c99fc79d1ca9c
parent50b6e5145b2207a553f4fb1fccd9902993794934
[perl #127635] s///r with -DPERL_NO_COW attempts to modify source SV

based on work done by bulk88, per his notes below:

I found pp_subst with a -DPERL_NO_COW build on an experimental perl branch
would die in ../dist/SelfLoader/t/03taint.t in this line
"my $file = __FILE__ =~ s/[\w.]+\z/01SelfLoader.t/r;" with a attempt to
modify since sv_force_normal_flags checks for readonlyness. The
-DPERL_NO_COW exclusive logic seems faulty, since the COW branch right
above stores the cow status and doesn't call sv_force_normal_flags until
it actually wants to modify the source SV, and pp_subst wont modify the
source SV if PMf_NONDESTRUCT is on.

So fix the die by only de-COWing if !PMf_NONDESTRUCT. Do not deCOW the
source SV if PMf_NONDESTRUCT. The
"my $file = __FILE__ =~ s/[\w.]+\z/01SelfLoader.t/r;" fatal die can not be
reproduced in blead perl with -DPERL_NO_COW, only in my experimental branch
so I rewrote the test to use a const sub that is folded to a
HEK COW RO SV * instead of the __FILE__ token which is not a HEK COW on
blead perl. The subst.t test only fails if perl is compiled with
-DPERL_NO_COW. To avoid an extra !(rpm->op_pmflags & PMf_NONDESTRUCT) check
on a NO_COW build, restructure the logic so
!(rpm->op_pmflags & PMf_NONDESTRUCT) is tested only once. Filed as
[perl #127635].
pp_hot.c
t/re/subst.t