mktempのバグ
[その名前がすでに存在しているかどうかテストして、そのファイルをオープンする間に競合がある事・・・]
の実証コードor起こす方法を教えてください。
使用しているgccは2.3.2です。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/mktemp.3.html
http://excite.okwave.jp/kotaeru.php3?q=1235735
OKWave gcc に mktemp 危険と怒られたのはなぜ?
問題になっている現象はここで議論されています。
php-3.0.18-i18n-ja-2でもこの問題が発生しました。
php3を使ってファイルをサーバに転送する機能を
使用した際に、この問題が発生しました。
実証コードとしては、ファイル転送を行うプログラムを作成し、
複数人で同時に実行するとサーバ上のテンポラリ
ファイルの作成にて競合が発生します。
http://www-06.ibm.com/jp/developerworks/linux/050114/j_l-sprace2...
IBM dW : Linux : セキュアなプログラマー: 競合状態を防ぐ - Japan
例えば以下のようなプログラムを作って実行します。
すると、今から作成するファイル名が表示されます。
このまま放置しておけば1分後に0バイトのファイルが作成されて終了しますが、この1分以内に同名でディレクトリや書き込み権限のないファイルを作るとエラーで終了します。
実際にはmktempからファイルの作成までの時間はより短時間ですが、アトミックな操作でないことが問題になります。
#include <stdlib.h>
#include <stdio.h>
int main (void)
{
char tempname[]=”ZZXXXXXX”;
FILE *fp;
if (mktemp(tempname)==NULL)
fputs(”mktemp error.¥n”, stdout);
printf(”Temporary file name is:%s¥n”, tempname);
sleep(60);
fp=fopen(tempname, ”w”);
if(fp==NULL)
fputs(”fopen error.¥n”, stdout);
else
fclose(fp);
return 0;
}
Yahoo! JAPAN
URLはダミーです。
確実に起こすためにはmktemp()とfopen()の間にsleep()を入れて、sleepしている間にmktemp()で作成されたファイルを別のプログラムが作成してしまえば簡単に起こせます。
コードの断片を示すと
file = mktemp(””);
printf(”%s¥n”, file);
sleep(10);
fp = fopen(file, ”w”);
fclose(fp);
のようなコードを組んでsleepしている最中に
printf()で出力されたファイル名を作成してしまえば確実に発生します。
また、上記コードを無限ループさせて
上記のプログラムを何個か立ち上げておけば何時かは発生します。
コメント(0件)