我想安全地能够模拟open
与O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW
O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW
O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW
和O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW
O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW
O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW
上不支持系统O_NOFOLLOW
。 我可以在某种程度上实现什么,我要求有:
struct stat lst;
if (lstat(filename, &lst) != -1 && S_ISLNK(lst.st_mode)) {
errno = ELOOP;
return -1;
}
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, mode);
但后来我介绍一个竞争条件和可能的安全问题。
我想过,也许,只有用户能够编写,有点像创建一个虚拟文件touch
荷兰国际集团filename
,做lstat
检查,然后使用chmod
我写完后(更正文件模式位),但我可能是俯瞰主要的东西(例如,如果在文件filename
存在,不是一个普通的文件,或者已经是一个符号链接)。
你怎么看?