2011年6月26日

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

青柳です。

今回はコーディング規則と違って実害のある話です。ただし、実害が起こりえる
可能性は事実上ゼロに等しく、そういう意味ではこれも放置しても特に問題が
ある話ではありません。気になったのでご報告いたします。


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


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




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