タイトルはすべてを物語っています: Time of Check to Time of Use (TOCTOU) 競合状態を回避するためstat()
に afterを使用できますか? fopen()
いくつかの詳細:
ファイルの読み取りのみを行う C プログラムを作成していますが、ディレクトリの読み取りを要求されたときに適切にエラーが発生する必要があります。現時点では、open()
(with ) を使用してエラーを生成し、次のようにO_RDWR
をチェックerrno
します。EISDIR
int fd = open(path, O_RDWR);
if (fd == -1) {
if (errno == EISDIR) return PATH_IS_DIR;
else return FILE_ERR;
}
上記の解決策の問題は、このプログラムがファイルを読み取るだけでよいことです。そのため、でファイルを開くとO_RDWR
、ユーザーが読み取り権限を持っているが書き込み権限を持っていない場合、誤って権限エラーが発生する可能性があります。
TOCTOU 競合状態を回避するために次のことを行うことは可能ですか?
struct stat pstat;
FILE *f = fopen(path, "r");
if (!f) return FILE_ERR;
if (stat(path, &pstat) == -1) {
fclose(f);
return FILE_ERR;
}
if (S_ISDIR(pstat.st_mode)) {
fclose(f);
return PATH_IS_DIR;
}
それが不可能な場合、TOCTOU のバグや間違った許可エラーを防ぐ別の解決策はありますか?