You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by mm...@apache.org on 2008/09/25 17:44:26 UTC
svn commit: r699006 - in /spamassassin/trunk/lib/Mail/SpamAssassin:
Message.pm Message/Node.pm
Author: mmartinec
Date: Thu Sep 25 08:44:26 2008
New Revision: 699006
URL: http://svn.apache.org/viewvc?rev=699006&view=rev
Log:
Message.pm and Message/Node.pm: replace line-by-line reading by
sysread + split, thus avoiding a Perl i/o bug on some platforms
( http://rt.perl.org/rt3//Public/Bug/Display.html?id=39060 ,
SA Bug 5985), while also providing a little speedup (10..25%)
on reading a message.
Modified:
spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
spamassassin/trunk/lib/Mail/SpamAssassin/Message/Node.pm
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm?rev=699006&r1=699005&r2=699006&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm Thu Sep 25 08:44:26 2008
@@ -132,16 +132,27 @@
}
elsif (ref $message eq 'GLOB' || ref $message eq 'IO::File') {
if (defined fileno $message) {
- $! = 0; @message = <$message>;
- $!==0 or die "error reading: $!";
- dbg("message: empty message read from a file") if !@message;
+
+ # $! = 0; @message = <$message>;
+ # $!==0 or die "error reading: $!";
+
+ # sysread+split avoids a Perl I/O bug (Bug 5985)
+ # and is faster than (<$message>) by 10..25 %
+ # (a drawback is a short-term double storage of a text in $raw_str)
+ #
+ my($inbuf,$nread,$raw_str); $raw_str = '';
+ while ( $nread=sysread($message,$inbuf,16384) ) { $raw_str .= $inbuf }
+ defined $nread or die "error reading: $!";
+ @message = split(/^/m, $raw_str, -1);
+
+ dbg("message: empty message read") if $raw_str eq '';
}
}
elsif (ref $message) {
dbg("message: Input is a reference of unknown type!");
}
elsif (defined $message) {
- @message = split ( /^/m, $message );
+ @message = split(/^/m, $message, -1);
}
# Pull off mbox and mbx separators
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Message/Node.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Message/Node.pm?rev=699006&r1=699005&r2=699006&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Message/Node.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Message/Node.pm Thu Sep 25 08:44:26 2008
@@ -271,14 +271,13 @@
if (ref $self->{'raw'} eq 'GLOB') {
my $fd = $self->{'raw'};
seek($fd, 0, 0) or die "message: cannot rewind file: $!";
- $! = 0;
- my @array = <$fd>;
- if ($! != 0) {
- if (!$fd->eof()) { # bug 5985: avoid spurious 'bad fd' error
- die "message: error reading: $!";
- }
- }
- dbg("message: empty message read") if !@array;
+
+ my($inbuf,$nread,$raw_str); $raw_str = '';
+ while ( $nread=sysread($fd,$inbuf,16384) ) { $raw_str .= $inbuf }
+ defined $nread or die "error reading: $!";
+ my @array = split(/^/m, $raw_str, -1);
+
+ dbg("message: empty message read") if $raw_str eq '';
return \@array;
}
@@ -310,14 +309,12 @@
if (ref $self->{'raw'} eq 'GLOB') {
my $fd = $self->{'raw'};
seek($fd, 0, 0) or die "message: cannot rewind file: $!";
- local $/ = undef;
- $! = 0; $raw = <$fd>;
- defined $raw || $!==0
- or die "message: error reading from a temp file: $!";
- if (!defined $raw) {
- dbg("message: empty message read from a temp file");
- $raw = '';
- }
+
+ my($inbuf,$nread,$raw_str); $raw = '';
+ while ( $nread=sysread($fd,$inbuf,16384) ) { $raw .= $inbuf }
+ defined $nread or die "error reading: $!";
+
+ dbg("message: empty message read from a temp file") if $raw eq '';
}
else {
# create a new scalar from the raw array in memory