cpan

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

一番の変更点は、(de|en)code元のtaintednessが変換後も保存されること。taintedessに関しては

も参考のこと。

変換結果のtaintednessがどうなるかというのは、非built-in以外はまちまちで、ざっと調べただけでもData::DumperYAMLは反映する一方、MIME::Base64JSON::XSは無視するといった具合で、Encodeも後者だったのですが、「言い訳無用」というお叱りを受けまして、「おっしゃるとおり」とばかり速攻で直した次第です。

とはいっても、(de|en)codeというのは文字コード別に実装方法がまちまちで(そうならざるを得ないのはソースを読んでいただければ)、それごとにtaintednessの伝播の方法も異なってきます。Encodeの場合、XSで変換するものとPure Perlでやっているものと主に二通りあったわけですが、前者の方が実は簡単で

if (SvTAINTED(src)) SvTAINTED_on(dst);

と見た目そのままなのに対し、後者は

my $dst = substr($src, 0, 0);

という方法でflagのみ取ってくるという方法をとっています。標準モジュールのScalar::Utilにもtainted()はあってもtaint()がないのはこういう時にちょっこと不便ですね。かといってこの場合CPANのTaint::Utilは使えませんし。簡単にuntaintできないのは合目的ではありますが…

ところでこの機構、JavaScriptとRubyにも存在します。前者の方は使いどころがいまいちはっきりせず、実際ほとんど使われていないのですが、Rubyの方はヴァージョンが上がる毎に進化していて、

p ENV['PATH']
p ENV['PATH'].tainted?

であれぇ、っとなったのですが、1.9以降では

p ENV['PATH'].tainted?
p ENV['PATH'].encoding
p ENV['PATH'].encode('UTF-8').tainted?

で、きちんとflagが伝播しているのを見てrubyえらいなーと思ったのもつかの魔、

p ENV['PATH'].tainted?
p ENV['PATH'].to_sym.to_s == ENV['PATH']
p ENV['PATH'].to_sym.to_s.tainted?
p ENV['PATH'].untaint

というのを見てずっこけた次第。

Encodeがtaint modeの伝播をサポートしていなかったことが今まで俎上に上がらなかったこと自体、Taint modeが使いづらくてわかりづらい割に肝心の時に役に立たない、というかCなどで拡張する際には個別対応せざるを得ないという点で時代遅れなのかもしれません。とはいえ時代遅れだとしたらなおのこそDWIMに行きたいもの。モジュール書きのみなさまにおかれては、taint checkのこともたまには思い出してくださいということで。

=head1 CPAN index

 User: DANKOGAI (Dan Kogai)
 Distribution file: Encode-2.50.tar.gz
 Number of files: 205
 *.pm files: 26
 README: Encode-2.50/README
 META-File: Encode-2.50/META.json
 META-Parser: Parse::CPAN::Meta 1.4404
 META-driven index: no
 Timestamp of file: Fri Apr 26 18:36:59 2013 UTC
 Time of this run: Fri Apr 26 18:38:37 2013 UTC

=head1 Changes

$Revision: 2.50 $ $Date: 2013/04/26 18:30:46 $
! Encode.xs Unicode/Unicode.xs
 lib/Encode/Unicode/UTF7.pm lib/CN/HZ.pm lib/Encode/GSM0338.pm
 t/taint.t
 Addressed: Encode::encode and Encode::decode 
            gratuitously launders tainted data
 Taintedness now propagates as it should.
 https://rt.cpan.org/Ticket/Display.html?id=84879
! encoding.pm
 Addressed: 5.18 deprecation
 https://rt.cpan.org/Ticket/Display.html?id=84709
! bin/piconv
 Applied: Update piconv documentation
 https://rt.cpan.org/Ticket/Display.html?id=84695

追記 2013.04.30:MS Cでコンパイルしない問題に対処した2.51をリリースしました。他はほとんど変化ありません(Strawberry Perlは2.50も無問題でした)

=head1 CPAN index

 User: DANKOGAI (Dan Kogai)
 Distribution file: Encode-2.51.tar.gz
 Number of files: 206
 *.pm files: 26
 README: Encode-2.51/README
 META-File: Encode-2.51/META.json
 META-Parser: Parse::CPAN::Meta 1.4404
 META-driven index: no
 Timestamp of file: Mon Apr 29 22:21:31 2013 UTC
 Time of this run: Mon Apr 29 22:23:20 2013 UTC

=head1 Changes

$Revision: 2.51 $ $Date: 2013/04/29 22:19:11 $
! Encode.xs
  Addressed: Encode.xs doesn't compile with Microsoft C compiler
  https://rt.cpan.org/Public/Bug/Display.html?id=84920
! MANIFEST
  Addressed: t/taint.t missing
  https://rt.cpan.org/Public/Bug/Display.html?id=84919

Dan the Encode Maintainer