【发布时间】:2017-12-30 18:17:38
【问题描述】:
我有一个类似这样的函数,旨在读取文件:
int foo(FILE* f)
我想使用flock 来防止TOCTTOU。 flock 需要文件描述符作为整数。我可以使用fileno(file) 得到这个。因此foo 的实现可能如下所示:
int foo(FILE* f) {
if(!f) return -1;
int fd = fileno(f);
if(fd < 0) return -1;
flock(fd, LOCK_EX);
//do all the reading stuff and so on.
}
然而,邪恶的用户可能会做这样的事情:
FILE* test;
test = fopen("someexistingfile.txt", "r");
fclose(test);
foo(test);
然后我有一个问题,因为fileno 会根据 valgrind 进行无效读取,因为它假定文件是打开的。
关于如何检查文件是否关闭的任何想法?
【问题讨论】:
-
“邪恶用户”?好吧,我会说“愚蠢”的用户。
-
查看
flock()的返回值。如果fd不是有效的描述符,我强烈认为它会失败。 -
@MartinR 问题是,如果文件关闭,
fileno已经给出无效读取 -
相关的stackoverflow.com/q/21450109/694576 如果不重复(请参阅此答案stackoverflow.com/a/21450247/694576)。
-
特别是文件描述符是不透明的数字,它只对内核意味着任何东西,如果它们是无效的(例如,你只是随机选择一个数字并尝试对其进行操作)它不会做任何事情.