content_charset and $_

Father Chrysostomos <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.lwp
Message-ID <[email protected]>
I came across a bug in HTTP::Message::content_charset. It has a ‘local  
$_’, which is unnecessary, since foreach loops already localise their  
topic. In fact, they do it in a safer way that is more like local *_= 
\do{my$x}. Using local $_ causes problems if $_ is tied. The attached  
patch removes the offending line and adds a test for it. This did  
actually occur in real code, and is not just a theoretical problem.
open_vsKSmGR8.txt (text/plain, 1.2 KB)
diff -Nurp libwww-perl-5.834-Yk3Kpv/lib/HTTP/Message.pm libwww-perl-5.834-Yk3Kpvcopy/lib/HTTP/Message.pm
--- libwww-perl-5.834-Yk3Kpv/lib/HTTP/Message.pm	2009-11-21 04:57:55.000000000 -0800
+++ libwww-perl-5.834-Yk3Kpvcopy/lib/HTTP/Message.pm	2010-01-03 11:25:13.000000000 -0800
@@ -205,7 +205,6 @@ sub content_charset
     my $cref = $self->decoded_content(ref => 1, charset => "none");
 
     # Unicode BOM
-    local $_;
     for ($$cref) {
 	return "UTF-8"     if /^\xEF\xBB\xBF/;
 	return "UTF-32-LE" if /^\xFF\xFE\x00\x00/;
diff -Nurp libwww-perl-5.834-Yk3Kpv/t/base/message-charset.t libwww-perl-5.834-Yk3Kpvcopy/t/base/message-charset.t
--- libwww-perl-5.834-Yk3Kpv/t/base/message-charset.t	2009-06-25 12:38:55.000000000 -0700
+++ libwww-perl-5.834-Yk3Kpvcopy/t/base/message-charset.t	2010-01-03 11:20:33.000000000 -0800
@@ -15,7 +15,7 @@ BEGIN {
 }
 
 use Test;
-plan tests => 21;
+plan tests => 22;
 
 use HTTP::Response;
 my $r = HTTP::Response->new(200, "OK");
@@ -91,3 +91,13 @@ $r->content(<<'EOT');
 encoding="US-ASCII" ?>
 EOT
 ok($r->content_charset, "US-ASCII");
+
+{
+ sub TIESCALAR{bless[]}
+ tie $_, "";
+ my $fail = 0;
+ sub STORE{ ++$fail }
+ sub FETCH{}
+ $r->content_charset;
+ ok($fail, 0, 'content_charset leaves $_ alone');
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.