1#!/usr/bin/perl -T 2use strict; 3use Encode qw(encode decode); 4local %Encode::ExtModule = %Encode::Config::ExtModule; 5use Scalar::Util qw(tainted); 6use Test::More; 7use Config; 8my $taint = substr($ENV{PATH},0,0); 9my $str = "dan\x{5f3e}" . $taint; # tainted string to encode 10my $bin = encode('UTF-8', $str); # tainted binary to decode 11my $notaint = ""; 12my $notaint_str = "dan\x{5f3e}" . $notaint; 13my $notaint_bin = encode('UTF-8', $notaint_str); 14my @names = Encode->encodings(':all'); 15if (exists($Config{taint_support}) && not $Config{taint_support}) { 16 plan skip_all => "your perl was built without taint support"; 17} 18else { 19 plan tests => 4 * @names + 2; 20} 21for my $name (@names) { 22 my ($d, $e, $s); 23 eval { 24 $e = encode($name, $str); 25 }; 26 SKIP: { 27 skip $@, 1 if $@; 28 ok tainted($e), "encode $name"; 29 } 30 $bin = $e.$taint if $e; 31 eval { 32 $d = decode($name, $bin); 33 }; 34 SKIP: { 35 skip $@, 1 if $@; 36 ok tainted($d), "decode $name"; 37 } 38} 39for my $name (@names) { 40 my ($d, $e, $s); 41 eval { 42 $e = encode($name, $notaint_str); 43 }; 44 SKIP: { 45 skip $@, 1 if $@; 46 ok ! tainted($e), "encode $name"; 47 } 48 $notaint_bin = $e.$notaint if $e; 49 eval { 50 $d = decode($name, $notaint_bin); 51 }; 52 SKIP: { 53 skip $@, 1 if $@; 54 ok ! tainted($d), "decode $name"; 55 } 56} 57Encode::_utf8_on($bin); 58ok(!Encode::is_utf8($bin), "Encode::_utf8_on does not work on tainted values"); 59Encode::_utf8_off($str); 60ok(Encode::is_utf8($str), "Encode::_utf8_off does not work on tainted values"); 61