【发布时间】:2019-03-27 21:47:19
【问题描述】:
标题说明了一切:可以使用stat() after 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 错误和错误权限错误?
【问题讨论】: