Название говорит само за себя: можно ли использовать stat()
после fopen()
, чтобы избежать условий гонки «Время проверки на время использования» (TOCTOU)?
Некоторые детали:
Я пишу программу на C, которая только читает файлы, но требует правильной ошибки при запросе на чтение каталога.На данный момент он использует open()
(с 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, а также ошибочных разрешений?