summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfukachan <fukachan>2001-02-03 15:29:44 +0000
committerfukachan <fukachan>2001-02-03 15:29:44 +0000
commit2bd489278fc3d72ff6b8107324a4726777ba0fc5 (patch)
tree7e742a2f931c76dc4f7f808279452c2e12fcc8b4
parentc7d058fd25ba2d1ee41c4d784c60484122abc742 (diff)
downloadfml8-2bd489278fc3d72ff6b8107324a4726777ba0fc5.tar.gz
fml8-2bd489278fc3d72ff6b8107324a4726777ba0fc5.tar.bz2
fml8-2bd489278fc3d72ff6b8107324a4726777ba0fc5.zip
fix multipart handling when the preamble is empty
-rw-r--r--fml/lib/MailingList/Messages.pm26
-rw-r--r--regress/base/msg_mp.160
-rw-r--r--regress/base/multipart_io.sh1
3 files changed, 78 insertions, 9 deletions
diff --git a/fml/lib/MailingList/Messages.pm b/fml/lib/MailingList/Messages.pm
index dd98d997..46947a3a 100644
--- a/fml/lib/MailingList/Messages.pm
+++ b/fml/lib/MailingList/Messages.pm
@@ -298,28 +298,37 @@ sub parse_mime_multipart
# pb = position of the beginning, pe = position of the end
my ($msg, $next_part, $prev_part, @m);
my $i = 0;
+
+ # check the preamble before multipart blocks
my $pb = 0;
my $pe = $buf_begin;
$self->_set_pos( $pe + 1 );
do {
- $m[ $i++ ] = _alloc_new_part($self, {
- boundary => $boundary,
- offset_begin => $pb,
- offset_end => $pe,
- content => $content,
- });
+ # XXX not effective region if $pe <= $pb
+ # we should check this to avoid the empty preamble case.
+ if ($pe > $pb) {
+ $m[ $i++ ] = _alloc_new_part($self, {
+ boundary => $boundary,
+ offset_begin => $pb,
+ offset_end => $pe,
+ content => $content,
+ });
+ }
($pb, $pe) = $self->_next_part_pos($content, $boundary);
+ # the closing of the blocks
if ($pe > $buf_end) { $boundary .= "--";}
-
my $buf = $boundary."\n";
+
+ # add the multipart delimiter
$m[ $i++ ] = _alloc_new_part($self, {
content => \$buf
});
} while ($pe <= $buf_end);
+ # check the trailor after multipart blocks exists or not.
my $p = index($$content, "\n", $buf_end) + 1;
if (($content_length - $p) > 0) {
$m[ $i++ ] = _alloc_new_part($self, {
@@ -330,6 +339,7 @@ sub parse_mime_multipart
});
}
+ # build a chain of multipart blocks and delimeters
my $j = 0;
for ($j = 0; $j < $i; $j++) {
if (defined $m[ $j + 1 ]) {
@@ -341,8 +351,6 @@ sub parse_mime_multipart
}
next_chain($self, $m[0]);
-
- # use Data::Dumper; print Dumper( $self );
}
diff --git a/regress/base/msg_mp.1 b/regress/base/msg_mp.1
new file mode 100644
index 00000000..3dd9a2c1
--- /dev/null
+++ b/regress/base/msg_mp.1
@@ -0,0 +1,60 @@
+Mime-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="----_=_NextPart_000_01BE1C09.8D2506D0"
+Precedence: bulk
+
+------_=_NextPart_000_01BE1C09.8D2506D0
+Content-Type: text/plain;
+ charset="iso-2022-jp"
+
+fukachan. test of multipart.
+
+--fukachan
+
+------_=_NextPart_000_01BE1C09.8D2506D0
+Content-Type: image/gif;
+ name="ecscc.gif"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="ecscc.gif"
+Content-Location: ATT-0-7EE83767F087D211BEF500805F8BE119-e
+ cscc.gif
+
+R0lGODlhrABLAPcAAAAAAJlcAP+ZCv+ZEP+aF/+bHP+bH/+cJf+dKf+eLf+fM/+gOf+hPP+jQP+l
+Rv+mTP+oUP+qVP+sW/+tXv+wZP+yaf+0bf+3c/+4dv/CZv+8ff++gP/AhP/Cif/Gj//Ik//Jlv/M
+m//Pn//Qov/Spv/Vqv/WrP/Yr//asv/ctf/euP/euf/hvP/hvv/jwP/kwf/lw//mxP/mxf/nxv/o
+yP/pyf/pyv/qyv/qy////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADkALAAAAACsAEsA
+AAj/AHMIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX
+MGPKnEmzps2bOHPq3MmzZ84AQIMKHUq0qNGjSIf6lBkAh9OnUKNKnUq1qtWoS2E2vcq1q9eqGbK6
+DHCjrNmzaNOqXcu2LdqwYlkGsEG3rt27ePPq3cv3Lty4KgPUGEy4sOHDiBMrXmz4L2CUAWhInky5
+suXLmDNrruz4scnIm0OLHp25s2eSAWaoXs26tevXsGPLbm36tMgAMnLr3s27t+/fwIPzrm0bZIAY
+yJMrX868ufPn0JcTL+4xAIzr2LNr3869u/fv2qdT/+cY4IX58+jTq1/Pvr379OLHawzgor79+/jx
+A9jPH4B9//kFKGCA8cmHUQAtJKjgggwqyB+D/QHQ4IQUUliggRYFwMKGHHbo4Yb7fQgifyKWaKKH
+F2JIUQArtOjiizCusF+ML/JH4404wpiiihIFoMKPQAYp5H5CFqkCkUYmqWSQO/IIUQApRCnllFPy
+R+WVKeyH5ZZcUtmkkw4FgMKYZJZZJn9mpjkmAGq26aaZX4LJUAAn1GnnnXbyh+eefN4ZYZ+Aximn
+QgGYYOihiB7KX6KMNmrofopC6mijgg6KUAAlZKrpppryx+mnoJawH6eehvpppZYaFAAJrLbqaqv8
+vf8q66wk7PdqrLTKimqqBAUwwq/ABgssf8IWa+x+xwJg7LK76pTUs0aJIO201E7LX7XYZrtfttx2
+C+23QNkE7rchlGvuuebyh+667O7H7rvwjpvUTSDUa++9+Oar77777scvv/z1++/ABA9cUwYfJKzw
+wgw37PDDDfMH8cMSRwzAxBhnDHEGHNuUgQcghyzyyCSXbPLI+52MMsj9kQyAyjDHbDLHzY6UQQc4
+56zzzjz37HPO/P0MtM79EQ2A0EgnzTPNPmXAwdNQRy311FRX/TR/VnMAgNQRRpj112BHzbRYGWxg
+9tlop6322mybzZ/a+63dddxt12132mM/loEGfPf/7fffgAcuON9zD044f4YnrnjfeduWAQaQRy75
+5JRXbvnlmGeu+eYYND5eBheELvropJdu+umop6766ql7jmEGFsQu++y012777bjnrvvutbvuZAYV
+BC/88MQXb/zxyCev/PLB+z5oBhREL/301Fdv/fXYZ6999s7zmsEE4Icv/vjkl2/++einT373vA6U
+gQTwxy///PTXb//9+OcPP/vtF5RBBAAMoAAHSMACGvCACDwg//p3kAxA4IEQjKAEJ0jBClrwghJc
+IAMTkoEHePCDIAyhCEdIwhKa8AEa3OBCMuCAFrrwhTCMoQxnSEMZplCFDclAA3bIwx768IdADKIQ
+t3l4Qxw+JAMMSKISl8jEJjrxiU8sohEjkoEFWPGKWMyiFrfIRSxKcYoTyYACxkjGMprxjGhM4xfB
+WJEMJOCNcIyjHOdIxziukY0XyQAC9sjHPvrxj4C8Ix4zkoEDGPKQiEykIg8pyEFuJAMGiKQkJ0lJ
+SjbSkR3JQAE2yclOerIAl8TkRzJAgFKa8pSlDKUoQ5KBAbjyla5U5SptJoBaCkCWsywJzWqWy176
+8pfADKYwh0nMYhYkIAA7
+
+------_=_NextPart_000_01BE1C09.8D2506D0--
diff --git a/regress/base/multipart_io.sh b/regress/base/multipart_io.sh
index 01ba7a0a..82d1808e 100644
--- a/regress/base/multipart_io.sh
+++ b/regress/base/multipart_io.sh
@@ -16,6 +16,7 @@ DIFF () {
}
DIFF $dir/msg_mp
+DIFF $dir/msg_mp.1
DIFF $dir/msg_mp.2
exit 0;