人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

c言語についての質問です。
mktempのバグ
[その名前がすでに存在しているかどうかテストして、そのファイルをオープンする間に競合がある事・・・]
の実証コードor起こす方法を教えてください。

使用しているgccは2.3.2です。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/mktemp.3.html

●質問者: f_kennedy
●カテゴリ:コンピュータ
✍キーワード:C言語 gcc いるか オープン コード
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kimizu
●30ポイント

http://excite.okwave.jp/kotaeru.php3?q=1235735

OKWave gcc に mktemp 危険と怒られたのはなぜ?

問題になっている現象はここで議論されています。

php-3.0.18-i18n-ja-2でもこの問題が発生しました。

php3を使ってファイルをサーバに転送する機能を

使用した際に、この問題が発生しました。

実証コードとしては、ファイル転送を行うプログラムを作成し、

複数人で同時に実行するとサーバ上のテンポラリ

ファイルの作成にて競合が発生します。


2 ● i_kumagoro
●100ポイント

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;

}


3 ● dev_zer0
●100ポイント

http://www.yahoo.co.jp/

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.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ