2011年6月26日

[Namazu-devel-ja 1794] Re:テンポラリファイル作成について

臼田です。

問題の部分はrevision 1.6 で入れて、 revision 1.9 で
修正してもらった部分です。

http://cvs.namazu.org/namazu/filter/zip.pl?r1=1.5&r2=1.6
http://cvs.namazu.org/namazu/filter/zip.pl?r1=1.8&r2=1.9
http://www.namazu.org/ml/namazu-devel-ja/msg04295.html

http://www.namazu.org/ml/namazu-devel-ja/msg04298.html

指摘の問題点に関してこのフィルタを作成した当時に考えていたことを、

1点目、3点目は
mknmz::util::tmpnam が使用するテンポラリフォルダは
インデックス作成フォルダなので他のアプリケーションがその中に
ファイルやフォルダを作成する可能性は低く、同名のフォルダ
が作成されるのはよほどの不注意がないかぎりありません。
一つのzipファイルを処理するなかでぶつからなければよいので
当初は乱数でなくカウントアップでもよいと考えていました。

2点目はこれまで症状を聞いていませんが甘い仕様でしょうかね。
ファイルが存在するときは$uniqnumberを作り直したがほうがよいかも。

my $tmpfile;
do {
my $uniqnumber = int(rand(10000));
$tmpfile = util::tmpnam('NMZ.zip' . substr("000$uniqnumber", -4));
} while (-f $tmpfile);
10000個以上のファイルを1つのファイルに詰め込んだzipファイル
があれば発現する症状でしょうが、それはないだろうと仮定しています。
1フォルダにそれだけのファイルを書き込んでしまうと別の問題が
でてくるようにも思えるので、可能性があるのであれば検討が必要かもしれません。

他の標準的なモジュールを使うことも検討しましたが、
・mknmzが想定しているディレクトリと異なるテンポラリフォルダが利用される。
 (他アプリケーションと衝突する確率が少し高まります)
・テンポラリファイル名に拡張子をつける方法がわからなかった。
 (mknmz から外部アプリケーションを呼び出す時に必要になることがありそう)
と言う点で現在のソースになっています。


mknmzがマルチスレッドになって同時に複数ファイルを処理するように
なるときには今の仕様のままでは困るかもとは思っています。

On 2011/06/26, at 11:30, Shigekazu Aoyagi wrote:

> 青柳です。
>
> 今回はコーディング規則と違って実害のある話です。ただし、実害が起こりえる
> 可能性は事実上ゼロに等しく、そういう意味ではこれも放置しても特に問題が
> ある話ではありません。気になったのでご報告いたします。
>
>
> filter/zip.pl などにおいて、テンポラリファイルを作成するのに以下のような
> コードが使用されております。
>
> my $tmpfile;
> my $uniqnumber = int(rand(10000));
> do {
> $tmpfile = util::tmpnam('NMZ.zip' . substr("000$uniqnumber", -4));
> $uniqnumber++;
> } while (-f $tmpfile);
>
> {
> my $fh = util::efopen("> $tmpfile");
> print $fh $$contref;
> util::fclose($fh);
> }
>
>
> このコードには三つ問題点があると考えます。
>
> 1. -fでファイル存在確認を行っているため、同名のディレクトリが存在した
>  場合にはループを脱出してファイルオープン処理に移行し、オープンに失敗
>  してcdie()してしまう。
>
> 2.0000から9999までのファイルが既に存在した場合、無限ループになる。
>
> 3.ファイル名を取得してからファイル作成までにタイムラグがあるので、その
>  間に他のプロセスから同名のファイルを作成される可能性があるという
>  mktemp(3)と同様の問題がある。
>
>
> 修正方法としては、これらの問題を抱えていないIO::File->new_tmpfile()や
> File::Tempなどを使用するのがいいのではないかと考えます。
> --
> Shigekazu Aoyagi <aoyagi@xxxxx>
>
> _______________________________________________
> Namazu-devel-ja mailing list
> Namazu-devel-ja@xxxxx
> http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-devel-ja
_______________________________________________
Namazu-devel-ja mailing list
Namazu-devel-ja@xxxxx
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-devel-ja

投稿者 xml-rpc : 2011年6月26日 12:57
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/104849
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。