
Encode 2.49 を Release しましたのでお報せします。
- /lang/perl/Encode/trunk - CodeRepos::Share - Trac
- dankogai's p5-encode at master - GitHub
- Dan Kogai / Encode - search.cpan.org
Encoding objects leak memory if decoding fails ・ Issue #8 ・ dankogai/p5-encode
We recently got a report about a memory leak in Mojolicious, and i've been able to track it down to our use of encoding objects
fix を送って来てくれたのは Unicode::UTF8 の中の人。大助かり。
メモリーリークがらみなので、緊急度は高めです。
=head1 CPAN index User: DANKOGAI (Dan Kogai) Distribution file: Encode-2.49.tar.gz Number of files: 205 *.pm files: 26 README: Encode-2.49/README META-File: Encode-2.49/META.json META-Parser: Parse::CPAN::Meta 1.4404 META-driven index: no Timestamp of file: Tue Mar 5 03:19:15 2013 UTC Time of this run: Tue Mar 5 03:20:52 2013 UTC =head1 Changes $Revision: 2.49 $ $Date: 2013/03/05 03:12:49 $ ! Encode.xs Addressed: Encoding objects leak memory if decoding fails https://github.com/dankogai/p5-encode/issues/8
Dan the Encode Maintainer
追記: 対応前のEncodeでメモリーリークが発生しうるのは
- UTF-8のデコードで
- CHECKに
Encode::DIE_ON_ERR
がセットされ - 不正なUTF-8文字列を食わせ
- かつそのブロックが
eval{ }
でくくられていたとき
です。eval{ }
でくくられていなければ、perlがdieする際に当然メモリーも解放されますが、この場合はそうはならないためメモリーリークが成立してしまうというわけです。
githubのissueページの再現コードにあるように、何度も繰り返しこれを行わないとなかなか顕在化しにくいバグでもあります。
XSがわかる方向にさらに解説すると、要はsv_2mortal()
をかけるタイミングが遅かったというものですが、当該部分は Nick Ing-Simmons が Encode.xs を書き下ろしていた頃から存在している、かなり年期の入ったものです(Encode本体のバージョン1.80, Encode.xs の Revision 1.50)。10年ものですね。
Encode のバージョンアップすべきかどうかの判断材料がほしいので、わかるようならば教えていただきたいです。