This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Protect ${^E_NCODING} from abuse
authorFather Chrysostomos <sprout@cpan.org>
Fri, 21 Nov 2014 16:24:06 +0000 (08:24 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 22 Nov 2014 12:54:06 +0000 (04:54 -0800)
When read, it is now always undef.  When set, it croaks as though
read-only except in the encoding package.  Hopefully that will dis-
suade anyone from depending on it.

mg.c
t/op/magic.t

diff --git a/mg.c b/mg.c
index f4ee820..6538003 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -858,6 +858,8 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
         if (nextchar != '\0') {
             if (strEQ(remaining, "NCODING"))
                 sv_setsv(sv, _get_encoding());
+            else if (strEQ(remaining, "_NCODING"))
+                sv_setsv(sv, NULL);
             break;
         }
 
@@ -2648,6 +2650,8 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
             /* It may be the shadow variable ${E_NCODING} which has lexical
              * scope.  See comments at Perl__get_encoding in this file */
             if (*(mg->mg_ptr + 1) == '_') {
+                if (CopSTASH(PL_curcop) != get_hv("encoding::",0))
+                    Perl_croak_no_modify();
                 lex = TRUE;
                 offset++;
             }
index afc99c5..bb9d175 100644 (file)
@@ -5,7 +5,7 @@ BEGIN {
     chdir 't' if -d 't';
     @INC = '../lib';
     require './test.pl';
-    plan (tests => 187);
+    plan (tests => 190);
 }
 
 # Test that defined() returns true for magic variables created on the fly,
@@ -675,6 +675,12 @@ is ${^MPEN}, undef, '${^MPEN} starts undefined';
 # This one used to croak due to that missing break:
 is ++${^MPEN}, 1, '${^MPEN} can be incremented';
 
+eval { ${^E_NCODING} = 1 };
+like $@, qr/^Modification of a /, 'Setting ${^E_NCODING} croaks';
+$_ = ${^E_NCODING};
+pass('can read ${^E_NCODING} without blowing up');
+is $_, undef, '${^E_NCODING} is undef';
+
 # ^^^^^^^^^ New tests go here ^^^^^^^^^
 
 SKIP: {