#!./perl -Tw # Testing Cwd under taint mode. use strict; use Cwd; chdir 't' unless $ENV{PERL_CORE}; use File::Spec; use lib File::Spec->catdir('t', 'lib'); use Test::More; BEGIN { plan( !eval { eval("1".substr($^X,0,0)) } ? (tests => 21) : (skip_all => "A perl without taint support") ); } use Scalar::Util qw/tainted/; my @Functions = qw(getcwd cwd fastcwd fastgetcwd abs_path fast_abs_path realpath fast_realpath ); foreach my $func (@Functions) { no strict 'refs'; my $cwd; eval { $cwd = &{'Cwd::'.$func} }; is( $@, '', "$func() should not explode under taint mode" ); ok( tainted($cwd), "its return value should be tainted" ); } # Previous versions of Cwd tainted $^O is !tainted($^O), 1, "\$^O should not be tainted"; { # [perl #126862] canonpath() loses taint my $tainted = substr($ENV{PATH}, 0, 0); # yes, getcwd()'s result should be tainted, and is tested above # but be sure ok tainted(File::Spec->canonpath($tainted . Cwd::getcwd)), "canonpath() keeps taint on non-empty string"; ok tainted(File::Spec->canonpath($tainted)), "canonpath() keeps taint on empty string"; (Cwd::getcwd() =~ /^(.*)/); my $untainted = $1; ok !tainted($untainted), "make sure our untainted value is untainted"; ok !tainted(File::Spec->canonpath($untainted)), "canonpath() doesn't add taint to untainted string"; }