标题说明了一切:是否可以在使用stat()
后 fopen()
避免检查时间到使用时间 (TOCTOU) 竞争条件?
一些细节:
我正在编写一个仅读取文件的 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 错误以及错误的权限错误?