This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Carp: Stop polluting the caller's namespace if they lack @CARP_NOT or @ISA
authorBrian Fraser <fraserbn@gmail.com>
Mon, 13 May 2013 18:57:18 +0000 (15:57 -0300)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 9 Jun 2013 21:23:46 +0000 (14:23 -0700)
Turns out that this:

perl -MCarp -le 'package Foo; eval { Carp::croak(1) }; print keys %Foo::;'

Would leave two new symbols in Foo, CARP_NOT and ISA. This commit
changes trusts_directly() to check if the symbols exists in the
stash before using them.

dist/Carp/lib/Carp.pm
dist/Carp/t/Carp.t

index 69caac3..6162177 100644 (file)
@@ -24,7 +24,7 @@ BEGIN {
     }
 }
 
-our $VERSION = '1.29';
+our $VERSION = '1.30';
 
 our $MaxEvalLen = 0;
 our $Verbose    = 0;
@@ -431,10 +431,15 @@ sub trusts {
 sub trusts_directly {
     my $class = shift;
     no strict 'refs';
-    no warnings 'once';
-    return @{"$class\::CARP_NOT"}
-        ? @{"$class\::CARP_NOT"}
-        : @{"$class\::ISA"};
+    my $stash = \%{"$class\::"};
+    for my $var (qw/ CARP_NOT ISA /) {
+        # Don't try using the variable until we know it exists,
+        # to avoid polluting the caller's namespace.
+        if ( $stash->{$var} && @{"$class\::$var"} ) {
+           return @{"$class\::$var"}
+        }
+    }
+    return;
 }
 
 if(!defined($warnings::VERSION) ||
index f7c226a..09c6652 100644 (file)
@@ -3,7 +3,7 @@ no warnings "once";
 use Config;
 
 use IPC::Open3 1.0103 qw(open3);
-use Test::More tests => 61;
+use Test::More tests => 62;
 
 sub runperl {
     my(%args) = @_;
@@ -463,6 +463,16 @@ SKIP:
     );
 }
 
+{
+    package Foo::No::CARP_NOT;
+    eval { Carp::croak(1) };
+    ::is_deeply(
+        [ keys %Foo::No::CARP_NOT:: ],
+        [],
+        "Carp doesn't create CARP_NOT or ISA in the caller if they don't exist"
+    );
+}
+
 # New tests go here
 
 # line 1 "A"