c言語についての質問です。

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

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:kimizu No.1

回答回数726ベストアンサー獲得回数21

ポイント30pt

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

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

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

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

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

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

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

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

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

id:i_kumagoro No.2

回答回数170ベストアンサー獲得回数58

ポイント100pt

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;

}

id:dev_zer0 No.3

回答回数332ベストアンサー獲得回数25

ポイント100pt

URLはダミーです。

確実に起こすためにはmktemp()とfopen()の間にsleep()を入れて、sleepしている間にmktemp()で作成されたファイルを別のプログラムが作成してしまえば簡単に起こせます。


コードの断片を示すと

file = mktemp(””);

printf(”%s¥n”, file);

sleep(10);

fp = fopen(file, ”w”);

fclose(fp);

のようなコードを組んでsleepしている最中に

printf()で出力されたファイル名を作成してしまえば確実に発生します。


また、上記コードを無限ループさせて

上記のプログラムを何個か立ち上げておけば何時かは発生します。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません