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