ExtMail服务器社区's Archiver

hzqbbc 发表于 2009-3-12 17:06

ExtMail Webmail 出现unknow.bin的分析与补丁

Hi all:

论坛有用户反映webmail读新邮件(带附件)时第一次下栽附件提示unknow.bin,返回邮件列表再读邮件就正常,而使用EMOS或maildrop的朋友却从未遇到此问题(1.0.5版本以后)。

[b]问题概述[/b]

在论坛的朋友gaosheng_guo 协助下,终于分析清楚出现这个情况的原因,主要原因是由于maildir_find() 函数中,处理文件名的正则表达式不完善,只考虑了Maildir++的规范,而没有考虑好对Maildir(最原始版本)的支持,导致了这个bug。一般情况下谁也不会考虑到问题在此,例如:

virtual或其他不支持Maildir++的MDA产生的文件名:
[quote]
1236886591.Vfd02I7944afM711851.mail.example.com:2,A
[/quote]

maildrop或其他支持Maildir++的MDA产生的文件名:
[quote]
1236847295.M577390P24666V0000000000000908I00000000015601BA_0.mail.example.com,S=1242:2,A
[/quote]

可以看到Maildir++在文件名已附带了该文件的大小(S=xxx),而不支持Maildir++的则不包含此内容。

maildir_find() 函数只对S=xxx形式进行处理,没兼容到不包括此特征内容的情况,因此产生了unknow.bin的问题。

[b]解决方法[/b]

请打以下补丁:
[quote]
--- extmail-1.0.7/libs/Ext/Storage/Maildir.pm    2009-03-04 23:59:27.000000000 +0800
+++ extmail/libs/Ext/Storage/Maildir.pm 2009-03-12 16:45:03.000000000 +0800
@@ -687,13 +687,13 @@
     return "" unless($file); # check $file null or not
     return $file if (-r _name2mdir($fd).'/cur/'.$file);

-    $file=~s/,S=\d+.*//; # the static part
+    $file =~ s/(:?,S=\d+)*:2,.*$//; # the static part
     opendir DIR, _name2mdir($fd).'/cur/' or die "Error $!\n";
     my @lists = grep { !/^\./ } readdir DIR;
     close DIR;
     for(@lists) {
         my $tmpname = $_;
-        $tmpname =~ s/,S=\d+.*//;
+        $tmpname =~ s/(:?,S=\d+)*:2,.*$//;
         if($tmpname eq $file) {
             if(m#/#) {
                 s/.*\/([^\/]+)$/$1/; # save the filename
[/quote]

[b]受影响版本[/b]

Webmail 1.0.x 全部版本

macafee 发表于 2009-3-12 17:32

添加到1.07就是了,顺便升级版本号1.07p1。

hzqbbc 发表于 2009-3-12 17:36

呵呵。主要是很多人遇到此问题,都感觉到莫名其妙,就赶紧发布先。

这个补丁将会在1.0.8里出现的。

sailing123 发表于 2009-3-13 10:51

谢谢, 狂顶!

pen10 发表于 2009-3-14 09:35

还好,我们的是1236847295.M577390P24666V0000000000000908I00000000015601BA_0.mail.example.com,S=1242:2,A

dnnljexk 发表于 2009-3-21 22:52

顶~~~~~~:victory:

屠龙 发表于 2009-3-24 15:57

我也中招了,按楼主说的改了两行就行了,呵呵~:lol

ck862 发表于 2011-3-4 13:20

请问楼主,是不是

$file =~ s/(:?,S=\d+)*:2,.*$//; # the static part
$tmpname =~ s/(:?,S=\d+)*:2,.*$//;

$file=~s/,S=\d+.*//; # the static part
$tmpname =~ s/,S=\d+.*//;
可是我去看了,我的版本是1.0.1的,但是我里面,已经是像楼主说的那样的了。这是怎么回事?

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.