This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
eval: handle taint of overloaded/tied arg
authorDavid Mitchell <davem@iabyn.com>
Wed, 23 Jun 2010 23:02:39 +0000 (00:02 +0100)
committerDavid Mitchell <davem@iabyn.com>
Sat, 3 Jul 2010 15:25:58 +0000 (16:25 +0100)
string eval would check its arg for taint before processing magic, overload
etc. If the magic or overload returned a tainted value, it wouldn't
be detected. Fixes part of #75716.

lib/overload.t
pp_ctl.c

index 8a632a5..c1d4eaf 100644 (file)
@@ -47,7 +47,7 @@ sub numify { 0 + "${$_[0]}" } # Not needed, additional overhead
 package main;
 
 $| = 1;
-use Test::More tests => 4826;
+use Test::More tests => 4880;
 
 use Scalar::Util qw(tainted);
 
@@ -1867,6 +1867,11 @@ foreach my $op (qw(<=> == != < <= > >=)) {
 
        # XXX TODO: '<>'
 
+       # eval should do tie, overload on its arg before checking taint */
+       push @tests, [ '1;', 'eval q(eval %s); $@ =~ /Insecure/',
+               '("")', '("")', [ 1, 2, 0 ], 0 ];
+
+
        for my $sub (keys %subs) {
            my $term = $subs{$sub};
            my $t = sprintf $term, '$_[0][0]';
@@ -1990,7 +1995,6 @@ foreach my $op (qw(<=> == != < <= > >=)) {
                    $res = "$res" if $res_term =~ /\+\+|--/;
                    is(tainted($res), $exp_taint,
                            "$desc taint of result return");
-                   #XXX$res = "$res";
                    is($res, $exp, "$desc return value");
                    my $fns =($ov_pkg eq 'RT57012_OV_FB')
                                ? $exp_fb_funcs : $exp_funcs;
index 7d041bd..527cad9 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -3763,6 +3763,15 @@ PP(pp_entereval)
        saved_hh = MUTABLE_HV(SvREFCNT_inc(POPs));
     }
     sv = POPs;
+    if (!SvPOK(sv)) {
+       /* make sure we've got a plain PV (no overload etc) before testing
+        * for taint. Making a copy here is probably overkill, but better
+        * safe than sorry */
+       SV* tmpsv = newSV_type(SVt_PV);
+       sv_copypv(tmpsv, sv);
+       sv_2mortal(tmpsv);
+       sv = tmpsv;
+    }
 
     TAINT_IF(SvTAINTED(sv));
     TAINT_PROPER("eval");