MKTEMP

Section: C Library Functions (3)
索引 jman

BSD mandoc
 

索引

名称

mktemp - 一意な一時ファイル名を作成  

索引

ライブラリ

Lb libc  

索引

書式

In unistd.h Ft char * Fn mktemp char *template Ft int Fn mkstemp char *template Ft int Fn mkstemps char *template int suffixlen Ft char * Fn mkdtemp char *template  

索引

解説

Fn mktemp 関数は、与えられたファイル名テンプレートの一部を書き換えて ファイル名を作成します。 このファイル名は、関数が呼ばれた時に存在していないことが保証されており、 アプリケーションでの使用に適しています。 テンプレートとしては、 /tmp/temp.XXXXXX のように、任意のファイル名に数桁の文字 `X' が付いているものが使用されます。 後ろに続く `X' は、英数字の一意の組合せに置き換えられます。 Fn mktemp が戻す一意的なファイル名の数は、 `X' の数によって決まります。 `X' が 6 桁である場合、56800235584 (62 ** 6) 通りの可能な一時ファイル名から Fn mktemp によって一つ選ばれます。

Fn mkstemp 関数は、テンプレートを同じように置き換え、 モード 0600 でテンプレートファイルを作成し、 読み書き用としてオープンしたファイル記述子を返します。 こうすることにより、ファイルの存在を確認することと 使用するためにオープンすることとの間の競合状態を避けられます。

Fn mkstemps は、テンプレートにサフィックスを含めることができることを除いて Fn mkstemp と同様に動作します。 テンプレートは、 /tmp/tmpXXXXXXsuffix という形式である必要があります。 Fn mkstemps は、サフィックス文字列の長さを必要とします。

Fn mkdtemp 関数は、テンプレートを mktemp(3) と同じように置き換え、 モード 0700 でテンプレートディレクトリを作成します。  

索引

戻り値

成功した場合、 Fn mktemp 関数と Fn mkdtemp 関数は、テンプレートへのポインタを返し、失敗した場合 NULL を返します。 Fn mkstemp 関数と Fn mkstemps 関数は、適切なファイルを作成できない場合に -1 を返します。 どの関数呼出しでもエラーが発生すると、エラーコードがグローバル変数 errno に書き込まれます。  

索引

エラー

Fn mkstemp , Fn mkstemps , Fn mkdtemp 関数は、以下の値のうち 1 つを errno に設定します。

Bq Er ENOTDIR
テンプレートのパス名部分が、存在するディレクトリではありません。

Fn mkstemp , Fn mkstemps , Fn mkdtemp 関数は、 stat(2) 関数で規定されるどの値も errno に設定する可能性があります。

Fn mkstemp 関数と Fn mkstemps 関数は、 open(2) 関数で規定されるどの値も errno に設定する可能性があります。

Fn mkdtemp 関数は、 mkdir(2) 関数で規定されるどの値も errno に設定する可能性があります。  

索引

コアダンプを引き起こす問題としてよくあるものは、プログラマが、 Fn mktemp , Fn mkstemp , Fn mkstemps , Fn mkdtemp に読込み専用文字列を渡しているものです。 この問題は、 St -isoC コンパイラが普及する前に開発されたプログラムで多く見られます。 たとえば引数 Qq /tmp/tempfile.XXXXXX を指定して Fn mkstemp を呼び出すと、 Fn mkstemp が、指定された文字列定数を書き換えようとしてコアダンプが起こります。 問題を起こすプログラムが、このような関数呼出しを頻繁に行っている場合は、 メモリの書込み可能セグメントへ文字列定数を 保持するようにプログラムをコンパイルすることもできます。 詳細については、 gcc(1) を参照してください。  

索引

バグ

この関数群は推測可能なファイル名を生成しますが、 `X' の数を多くし作成可能な一時ファイル名の数を増やすことで、 推測される危険を最小化します。 Fn mktemp では、あるファイルが存在するかのテスト ( Fn mktemp 関数呼び出しの中) と、そのファイルを使用するためのオープン (その後のユーザアプリケーションの中) との間で競合が発生し、 これはセキュリティの面から見て、とても危険です。 Fn mkstemp には競合状態がありませんので、 可能な限り、この関数を使うべきでしょう。 もし Fn mkstemp が使用できない場合は、 Fn mktemp で生成されたファイル名を open(2) で開く時に O_EXCL フラグをつけるようにし、 失敗していないか戻り値をテストすべきでしょう。 こうすることによって、攻撃者がファイルの内容を操作したり 読んだりする意図を持ってファイルを既に作成していても、 プログラムが無闇に動作を継続することがなくなります。  

索引

関連項目

chmod(2), getpid(2), mkdir(2), open(2), stat(2)  

索引

歴史

Fn mktemp 関数は、 AT&T System v7 で登場しました。 Fn mkstemp 関数は、 BSD 4.4 で登場しました。 Fn mkdtemp 関数は、 Ox 2.2 ではじめて登場し、その後 Fx 3.2 で登場しました。 Fn mkstemps は Ox 2.4 ではじめて登場し、その後 Fx 3.4 で登場しました。


 

索引

Index

名称
ライブラリ
書式
解説
戻り値
エラー
バグ
関連項目
歴史

jman



Time: 07:06:59 GMT, January 12, 2009