aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authormbr <mbr@FreeBSD.org>2004-09-03 06:28:22 +0800
committermbr <mbr@FreeBSD.org>2004-09-03 06:28:22 +0800
commit6fe7f4a19f703b45e6b514b6cc0f019465a1c481 (patch)
tree9cab5c5eea5da9f1ca6fcf837ac8575b4ed3b738 /mail
parentcdcc1941259ecd5de84483c002fd7f5e33e08685 (diff)
downloadfreebsd-ports-gnome-6fe7f4a19f703b45e6b514b6cc0f019465a1c481.tar.gz
freebsd-ports-gnome-6fe7f4a19f703b45e6b514b6cc0f019465a1c481.tar.zst
freebsd-ports-gnome-6fe7f4a19f703b45e6b514b6cc0f019465a1c481.zip
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 <dfs@roaringpenguin.com>
Diffstat (limited to 'mail')
-rw-r--r--mail/p5-MIME-Tools/files/patch-Parser-MaxParts81
1 files changed, 81 insertions, 0 deletions
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<max_parts>), 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<Instance method.>
++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};
+ }
+
+ #------------------------------