From: Rafael Garcia-Suarez Date: Mon, 4 Aug 2003 20:26:17 +0000 (+0000) Subject: Fix bug #23141 : localization of readonly magic scalars X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=33f3c7b8444b48791ad016570a41a23483d750d2;p=p5sagit%2Fp5-mst-13.2.git Fix bug #23141 : localization of readonly magic scalars now produces an error "Modification of a read-only value attempted", instead of silently failing. p4raw-id: //depot/perl@20479 --- diff --git a/scope.c b/scope.c index f738b5b..673a312 100644 --- a/scope.c +++ b/scope.c @@ -214,7 +214,7 @@ S_save_scalar_at(pTHX_ SV **sptr) PL_tainted = oldtainted; } SvMAGIC(sv) = SvMAGIC(osv); - SvFLAGS(sv) |= SvMAGICAL(osv); + SvFLAGS(sv) |= SvMAGICAL(osv) | SvREADONLY(osv); /* XXX SvMAGIC() is *shared* between osv and sv. This can * lead to coredumps when both SVs are destroyed without one * of their SvMAGIC() slots being NULLed. */ diff --git a/t/op/local.t b/t/op/local.t index 1bb8b8a..5a5b7ee 100755 --- a/t/op/local.t +++ b/t/op/local.t @@ -1,6 +1,6 @@ #!./perl -print "1..75\n"; +print "1..78\n"; sub foo { local($a, $b) = @_; @@ -257,3 +257,17 @@ print "not " if exists $h{'y'}; print "ok 72\n"; print "not " if exists $h{'z'}; print "ok 73\n"; print "not " if exists $ENV{_A_}; print "ok 74\n"; print "not " if exists $ENV{_B_}; print "ok 75\n"; + +# local() and readonly magic variables + +eval { local $1 = 1 }; +print "not " if $@ !~ /Modification of a read-only value attempted/; +print "ok 76\n"; + +eval { for ($1) { local $_ = 1 } }; +print "not " if $@ !~ /Modification of a read-only value attempted/; +print "ok 77\n"; + +eval { for ($1) { local $_ = 1 } }; +print "not " if $@; +print "ok 78\n";