我有这样一个函数,它的目的是读取一个文件:
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将根据val差制进行无效读取,因为它假定文件是打开的。
关于如何检查文件是否已关闭,有什么想法吗?
发布于 2017-12-30 19:15:43
C11 n1570 7.21.3p4
FILE 对象的指针的值在关联文件关闭后为不确定值,(包括标准文本流)。一个零长度的文件(输出流没有写字符)是否真的存在是实现定义的。在fclose之后,在库函数中使用FILE *值会导致未定义的行为。在重新分配之前,指针的值根本无法安全地用于任何事情。
换句话说,您根本不可能做任何事情来区分您给出的FILE *值是否引用了一个有效的打开文件.除了针对NULL的测试--如果指针的值是NULL,它肯定不能指向打开的流。
https://stackoverflow.com/questions/48036658
复制相似问题