summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-01-22 22:48:42 -0800
committerFather Chrysostomos <sprout@cpan.org>2012-01-23 10:19:35 -0800
commit6dd7c1f1e9477c302194505f6e1aaa57121f68bd (patch)
tree14b7b5596967043f012f2ad35f241a90d6a7ae4a
parenta9a249629c8a321606e6b817e73a8f8a2c0ae36f (diff)
downloadperl-6dd7c1f1e9477c302194505f6e1aaa57121f68bd.tar.gz
Don’t allow read-only regexps to be tied
Since the test triggered another bug in freeing read-only regexps, this commit fixes that too.
-rw-r--r--sv.c4
-rw-r--r--t/op/tie.t10
2 files changed, 12 insertions, 2 deletions
diff --git a/sv.c b/sv.c
index 3736e2744d..3094274b0e 100644
--- a/sv.c
+++ b/sv.c
@@ -5310,7 +5310,7 @@ Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how,
if (SvREADONLY(sv)) {
if (
/* its okay to attach magic to shared strings */
- (!SvFAKE(sv) || isGV_with_GP(sv))
+ !SvIsCOW(sv)
&& IN_PERL_RUNTIME
&& !PERL_MAGIC_TYPE_READONLY_ACCEPTABLE(how)
@@ -6191,7 +6191,7 @@ Perl_sv_clear(pTHX_ SV *const orig_sv)
&& !(SvTYPE(sv) == SVt_PVIO
&& !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
Safefree(SvPVX_mutable(sv));
- else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
+ else if (SvPVX_const(sv) && SvIsCOW(sv)) {
unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
SvFAKE_off(sv);
}
diff --git a/t/op/tie.t b/t/op/tie.t
index b3331291fc..9301bb33a6 100644
--- a/t/op/tie.t
+++ b/t/op/tie.t
@@ -1030,6 +1030,16 @@ ok
Modification of a read-only value attempted at - line 16.
########
+# Similarly, read-only regexps cannot be tied.
+sub TIESCALAR { bless [] }
+$y = ${qr//};
+Internals::SvREADONLY($y,1);
+tie $y, "";
+
+EXPECT
+Modification of a read-only value attempted at - line 6.
+########
+
# tied() should still work on tied scalars after glob assignment
sub TIESCALAR {bless[]}
sub FETCH {*foo}