From fc918f70f48c8784f1c159aaddadce224bca7308 Mon Sep 17 00:00:00 2001 From: Martin Blapp Date: Thu, 2 Sep 2004 22:28:22 +0000 Subject: Limits the number of MIME parts we will parse. Normally, instances of this class parse a message to the bitter end. Messages with many MIME parts can cause excessive memory consumption. If you invoke this method, parsing will abort with a die() if a message contains more than NUM parts. Submitted by: David F. Skoll --- mail/p5-MIME-Tools/files/patch-Parser-MaxParts | 81 ++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 mail/p5-MIME-Tools/files/patch-Parser-MaxParts (limited to 'mail/p5-MIME-Tools') diff --git a/mail/p5-MIME-Tools/files/patch-Parser-MaxParts b/mail/p5-MIME-Tools/files/patch-Parser-MaxParts new file mode 100644 index 000000000000..75f150286be0 --- /dev/null +++ b/mail/p5-MIME-Tools/files/patch-Parser-MaxParts @@ -0,0 +1,81 @@ +--- lib/MIME/Parser.pm.orig Tue Aug 31 18:54:05 2004 ++++ lib/MIME/Parser.pm Tue Aug 31 18:53:33 2004 +@@ -250,6 +250,7 @@ + $self->{MP5_IgnoreErrors} = 1; + $self->{MP5_UseInnerFiles} = 0; + $self->{MP5_UUDecode} = 0; ++ $self->{MP5_MaxParts} = -1; + + $self->interface(ENTITY_CLASS => 'MIME::Entity'); + $self->interface(HEAD_CLASS => 'MIME::Head'); +@@ -277,6 +278,7 @@ + $self->{MP5_Filer}->results($self->{MP5_Results}); + $self->{MP5_Filer}->init_parse(); + $self->{MP5_Filer}->purgeable([]); ### just to be safe ++ $self->{MP5_NumParts} = 0; + 1; + } + +@@ -969,11 +980,19 @@ + # Retype => retype this part to the given content-type + # + # Return the entity. +-# Fatal exception on failure. ++# Fatal exception on failure. Returns undef if message to complex + # + sub process_part { + my ($self, $in, $rdr, %p) = @_; + ++ if ($self->{MP5_MaxParts} > 0) { ++ $self->{MP5_NumParts}++; ++ if ($self->{MP5_NumParts} > $self->{MP5_MaxParts}) { ++ # Return UNDEF if msg too complex ++ return undef; ++ } ++ } ++ + $rdr ||= MIME::Parser::Reader->new; + #debug "process_part"; + $self->results->level(+1); +@@ -1094,6 +1112,8 @@ + + Returns the parsed MIME::Entity on success. + Throws exception on failure. ++If the message contained too many ++parts (as set by I), returns undef. + + =cut + +@@ -1351,6 +1371,32 @@ + my $self = shift; + &MIME::Tools::whine("evil_filename deprecated in MIME::Parser"); + $self->filer->evil_filename(@_); ++} ++ ++#------------------------------ ++ ++=item max_parts NUM ++ ++I ++Limits the number of MIME parts we will parse. ++ ++Normally, instances of this class parse a message to the bitter end. ++Messages with many MIME parts can cause excessive memory consumption. ++If you invoke this method, parsing will abort with a die() if a message ++contains more than NUM parts. ++ ++If NUM is set to -1 (the default), then no maximum limit is enforced. ++ ++With no argument, returns the current setting as an integer ++ ++=cut ++ ++sub max_parts { ++ my($self, $num) = @_; ++ if (@_ > 1) { ++ $self->{MP5_MaxParts} = $num; ++ } ++ return $self->{MP5_MaxParts}; + } + + #------------------------------ -- cgit v1.2.3