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
- 名称
-
- ライブラリ
-
- 書式
-
- 解説
-
- 戻り値
-
- エラー
-
- 注
-
- バグ
-
- 関連項目
-
- 歴史
-
Time: 07:06:59 GMT, January 12, 2009