diff options
author | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2003-08-04 20:26:17 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2003-08-04 20:26:17 +0000 |
commit | 33f3c7b8444b48791ad016570a41a23483d750d2 (patch) | |
tree | 91c26caacb3caa2aa9093ddfb3bd3a4e76e4d62e | |
parent | f913803b6e67ae4c588683bcf7820e5997343335 (diff) | |
download | perl-33f3c7b8444b48791ad016570a41a23483d750d2.tar.gz |
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
-rw-r--r-- | scope.c | 2 | ||||
-rwxr-xr-x | t/op/local.t | 16 |
2 files changed, 16 insertions, 2 deletions
@@ -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 1bb8b8ac1b..5a5b7ee552 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"; |