Perl6-Pugs
view release on metacpan or search on metacpan
misc/pX/Common/Regexp-Test-Perl5Tests/t/op/taint.t view on Meta::CPAN
my $Invoke_Perl = $Is_VMS ? 'MCR Sys$Disk:[]Perl.' :
$Is_MSWin32 ? '.\perl' :
$Is_MacOS ? ':perl' :
$Is_NetWare ? 'perl' :
'./perl' ;
my @MoreEnv = qw/IFS CDPATH ENV BASH_ENV/;
if ($Is_VMS) {
my (%old, $x);
for $x ('DCL$PATH', @MoreEnv) {
($old{$x}) = $ENV{$x} =~ /^(.*)$/ if exists $ENV{$x};
}
eval <<EndOfCleanup;
END {
\$ENV{PATH} = '' if $Config{d_setenv};
warn "# Note: logical name 'PATH' may have been deleted\n";
\@ENV{keys %old} = values %old;
}
EndOfCleanup
}
# Sources of taint:
# The empty tainted value, for tainting strings
my $TAINT = substr($^X, 0, 0);
# A tainted zero, useful for tainting numbers
my $TAINT0;
{
no warnings;
$TAINT0 = 0 + $TAINT;
}
# This taints each argument passed. All must be lvalues.
# Side effect: It also stringifies them. :-(
sub taint_these (@) {
for (@_) { $_ .= $TAINT }
}
# How to identify taint when you see it
sub any_tainted (@) {
not eval { join("",@_), kill 0; 1 };
}
sub tainted ($) {
any_tainted @_;
}
sub all_tainted (@) {
for (@_) { return 0 unless tainted $_ }
1;
}
sub test ($;$) {
my($ok, $diag) = @_;
my $curr_test = curr_test();
if ($ok) {
print "ok $curr_test\n";
} else {
print "not ok $curr_test\n";
printf "# Failed test at line %d\n", (caller)[2];
for (split m/^/m, $diag) {
print "# $_";
}
print "\n" unless
$diag eq ''
or substr($diag, -1) eq "\n";
}
next_test();
return $ok;
}
# We need an external program to call.
my $ECHO = ($Is_MSWin32 ? ".\\echo$$" : $Is_MacOS ? ":echo$$" : ($Is_NetWare ? "echo$$" : "./echo$$"));
END { unlink $ECHO }
open PROG, "> $ECHO" or die "Can't create $ECHO: $!";
print PROG 'print "@ARGV\n"', "\n";
close PROG;
my $echo = "$Invoke_Perl $ECHO";
my $TEST = catfile(curdir(), 'TEST');
# First, let's make sure that Perl is checking the dangerous
# environment variables. Maybe they aren't set yet, so we'll
# taint them ourselves.
{
$ENV{'DCL$PATH'} = '' if $Is_VMS;
if ($Is_MSWin32 && $Config{ccname} =~ /bcc32/ && ! -f 'cc3250mt.dll') {
my $bcc_dir;
foreach my $dir (split /$Config{path_sep}/, $ENV{PATH}) {
if (-f "$dir/cc3250mt.dll") {
$bcc_dir = $dir and last;
}
}
if (defined $bcc_dir) {
require File::Copy;
File::Copy::copy("$bcc_dir/cc3250mt.dll", '.') or
die "$0: failed to copy cc3250mt.dll: $!\n";
eval q{
END { unlink "cc3250mt.dll" }
};
}
}
$ENV{PATH} = '';
delete @ENV{@MoreEnv};
$ENV{TERM} = 'dumb';
if ($Is_Cygwin && ! -f 'cygwin1.dll') {
system("/usr/bin/cp /usr/bin/cygwin1.dll .") &&
die "$0: failed to cp cygwin1.dll: $!\n";
eval q{
END { unlink "cygwin1.dll" }
};
}
if ($Is_Cygwin && ! -f 'cygcrypt-0.dll' && -f '/usr/bin/cygcrypt-0.dll') {
system("/usr/bin/cp /usr/bin/cygcrypt-0.dll .") &&
die "$0: failed to cp cygcrypt-0.dll: $!\n";
( run in 0.642 second using v1.01-cache-2.11-cpan-71847e10f99 )