ExtMail服务器社区's Archiver

hzqbbc 发表于 2009-5-6 22:41

FCGI模式下$1引起的异常BUG分析

Webmail 通过FCGI模式的支持可以大幅提升页面的解析速度,但在FCGI下,很多平常看起来再正常不过的一些代码,都可能引起一些想不到的问题,用户反映相对集中的就是有些邮件转发时会显示源代码,经过一段时间的跟踪和分析,终于发现了是由于FCGI下持续化环境引起的$1等regexp匹配结果不能自动清零引起的。

原因: FCGI持续化环境下$1等动态变量无法自动清零
[quote]
#!/usr/bin/perl -wT
print "content-type: text/html\n\n";
my $s = 'aa';
$s =~ m/(a)/;
print "\$1 => $1\n";
$s =~ m/(b)/;
print "\$1 => $1\n";
[/quote]

在dispatch.fcgi下执行此脚本,输出的结果是2个$1 => a 第二次无法匹配时$1保留的是上一次的匹配结果,
因此如果第二次引用$1时实际访问的是第一次(a)结果。这个情况在普通CGI模式下也存在,只是因为
cgi脚本执行方式不同,造成了$1在FCGI下默认有一个值(就是代码本身)。

正确的做法:
[quote]
#!/usr/bin/perl -wT
print "content-type: text/html\n\n";
my $s = 'aa';
if ($s =~ m/(a)/) {
    print "\$1 => $1\n";
}
if ($s =~ m/(b)/) {
    print "\$1 => $1\n";
}
[/quote]

此时只会输出一行$1 => a,如果$s='bb'则只输出一行$1 => b ,这里关键在于用if来判断是否匹配成功
然后再去访问$1,此时的$1就能保存正确匹配的结果。

对于类似:
[quote]
$s =~ s/(abc)/$1_efg/;
[/quote]

这样的regexp,则不存在上述的问题。因此,基于此原则,后期将针对这个问题对代码中涉及类似匹配的
地方进行处理,以避免这种语法上没错但隐藏着风险的代码问题。

hondasky 发表于 2009-5-19 22:24

回复 1# hzqbbc 的帖子

哈哈  我发现那个问题  终于找到原因啦   恩 赶快解决啊  :lol :lol

bob.wang 发表于 2009-6-8 11:31

怎么解决

楼主你好!
      我现在也遇到了这个问题!
      十分期待您发布解决这个问题的版本!

hzqbbc 发表于 2009-6-8 13:42

最新版webmail已修复 写邮件里存在的这个问题..

gohome 发表于 2009-6-8 16:17

哪个版本?1.1.0 ?

bob.wang 发表于 2009-6-10 17:06

最新版本是1.1.0,邮件转发 会出现代码的问题!

在1.1。0中没有更新吧!
楼主加油!

hzqbbc 发表于 2009-6-11 09:58

Webmail 1.1.1 已包含修正,目前公布最新的1.1.0不含此修正,请多等些时日。

页: [1]

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