c语言里有没有办法通过文件句柄删除一个文件
类似于fd = open...delete_by_fd(fd)
查了下,unlink传的是路径名,这会导致一个问题,如下,但是它说的目录权限设置没看懂
Opening a UNIX file and unlinking it later creates
a race condition.
By replacing the named open file with another file
or symbolic link, an attacker can cause
unlink() to be applied to the wrong file.
This problem can be avoided with proper
permissions on the file’s containing directories.
用readlink拿路径再删
#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
int delete_file(int fd) {
char *str_fd = itoa(fd, str_fd, 10);
char *path = strcat("/proc/self/fd/", str_fd);
if (read_link(path, buffer, bufsize) == -1)
return -1;
int del = remove(filename);
if (!del)
printf("The file is Deleted successfully");
else
printf("The file is not Deleted");
return 0;
} shinzero 发表于 2023-4-2 10:41
用readlink拿路径再删
readlink 只是读取fd这个文件对应的内容,调用完readlink函数,cpu切换到另外一个进程,对该文件重命名,然后用其他文件重命名,切换回来后,remove函数删除的是被替换的文件,而不是原来的那个文件 这是并发问题,但是你的环境下真的会去做这种操作吗,你要照你贴的东西那样搞破坏? 本帖最后由 b0207191 于 2023-4-2 12:56 编辑
shinzero 发表于 2023-4-2 12:22
这是并发问题,但是你的环境下真的会去做这种操作吗,你要照你贴的东西那样搞破坏? ...
所以是想请教下怎么写可以防止并发的破坏
本来想用
old_flags |= FS_IMMUTABLE_FL;
if (ioctl(fd, FS_IOC_SETFLAGS, &old_flags) < 0){
perror("ioctl(2) error");
return 0;
}
但这样,程序自己都不能unlink这个文件了
不知道是否正确理解了楼主意思:
主楼里文档部分描述的解决方法是让程序运行在一个独立账户下(使用该账户的只有本程序),同时这个待删除文件的目录只准许该账户访问,那么其他任何程序就无法访问该文件了,自然也无法出现上面所说的其他程序并发操作问题(相当于文件被本程序独占了)。 xyx19851106 发表于 2023-4-2 15:58
不知道是否正确理解了楼主意思:
主楼里文档部分描述的解决方法是让程序运行在一个独立账户下(使用该账户 ...
这种方法感觉太复杂了,比如遇到这种的情况,应该是很常见的一个逻辑
1,判断一个文件大小,使用stat函数
2.如果太大删除它, unlink函数
如何让1,2步骤实现原子化
我比较好奇是什么实际场景需要在这种地方要求原子化 本帖最后由 xyx19851106 于 2023-4-2 21:02 编辑
b0207191 发表于 2023-4-2 20:33
这种方法感觉太复杂了,比如遇到这种的情况,应该是很常见的一个逻辑
1,判断一个文件大小,使用stat函数 ...
可以考虑使用flopen在打开文件时加锁互斥(删除仍然用unlink),但是这个接口貌似不是posix的标准接口(linux和bsd下应该是可用的)。
更正:忘了楼主是个完全不可控的并发环境,这应该是不行的。
ckl80 发表于 2023-4-2 20:42
我比较好奇是什么实际场景需要在这种地方要求原子化
是为了避免toctou
https://resources.infosecinstitute.com/topic/race-condition-toctou-vulnerability-lab/
页:
[1]