cpan

Encode 2.49 を Release しましたのでお報せします。

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年ものですね。