Fix problem with utf8/taint interaction (upstream changes #22842, #22843 and #22902). Thanks to Steinar Gunderson for analysis/patch. Additionally apply upstream changes #23084 and #23085 to correct problems with Tk 804.27 . diff -Naur --exclude=debian perl-5.8.4.orig/ext/Encode/lib/Encode/CN/HZ.pm perl-5.8.4/ext/Encode/lib/Encode/CN/HZ.pm --- perl-5.8.4.orig/ext/Encode/lib/Encode/CN/HZ.pm 2004-02-23 19:29:12.000000000 +0000 +++ perl-5.8.4/ext/Encode/lib/Encode/CN/HZ.pm 2006-05-10 03:08:42.303791195 +0000 @@ -152,7 +152,8 @@ $ret .= pack 'a*', $tmp; # remove UTF8 flag. } elsif ($str =~ s/(.)//) { - my $tmp = $GB->encode($1, $chk); + my $s = $1; + my $tmp = $GB->encode($s, $chk); last if !defined $tmp; if (length $tmp == 2) { # maybe a valid GB char (XXX) if ($in_ascii) { diff -Naur --exclude=debian perl-5.8.4.orig/ext/Encode/lib/Encode/Unicode/UTF7.pm perl-5.8.4/ext/Encode/lib/Encode/Unicode/UTF7.pm --- perl-5.8.4.orig/ext/Encode/lib/Encode/Unicode/UTF7.pm 2003-05-21 14:15:16.000000000 +0000 +++ perl-5.8.4/ext/Encode/lib/Encode/Unicode/UTF7.pm 2006-05-10 03:08:42.313791120 +0000 @@ -6,7 +6,7 @@ no warnings 'redefine'; use base qw(Encode::Encoding); __PACKAGE__->Define('UTF-7'); -our $VERSION = do { my @r = (q$Revision: 0.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +our $VERSION = '2.00_01'; use MIME::Base64; use Encode; @@ -38,7 +38,8 @@ if ($1 eq "+"){ $bytes .= "+-"; }else{ - my $base64 = encode_base64($e_utf16->encode($1), ''); + my $s = $1; + my $base64 = encode_base64($e_utf16->encode($s), ''); $base64 =~ s/=+$//; $bytes .= "+$base64-"; } diff -Naur --exclude=debian perl-5.8.4.orig/sv.c perl-5.8.4/sv.c --- perl-5.8.4.orig/sv.c 2004-03-31 15:03:57.000000000 +0000 +++ perl-5.8.4/sv.c 2006-05-10 03:11:23.912581291 +0000 @@ -3438,18 +3438,20 @@ U8 *s, *t, *e; int hibit = 0; - if (!sv) - return 0; - if (!SvPOK(sv)) { STRLEN len = 0; - (void) sv_2pv_flags(sv,&len, flags); - if (!SvPOK(sv)) - return len; + if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) { + (void) sv_2pv_flags(sv,&len, flags); + if (SvUTF8(sv)) + return len; + } else { + (void) SvPV_force(sv,len); + } } - if (SvUTF8(sv)) + if (SvUTF8(sv)) { return SvCUR(sv); + } if (SvREADONLY(sv) && SvFAKE(sv)) { sv_force_normal(sv); @@ -3504,7 +3506,7 @@ bool Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok) { - if (SvPOK(sv) && SvUTF8(sv)) { + if (SvPOKp(sv) && SvUTF8(sv)) { if (SvCUR(sv)) { U8 *s; STRLEN len; @@ -3566,7 +3568,7 @@ bool Perl_sv_utf8_decode(pTHX_ register SV *sv) { - if (SvPOK(sv)) { + if (SvPOKp(sv)) { U8 *c; U8 *e;