我希望能够安全地在不支持的系统上open
进行O_CREAT | O_WRONLY | O_TRUNC | 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
ing filename
,进行lstat
检查,然后chmod
在我完成写入后使用(以更正文件模式位),但我可能会忽略一些主要的东西(例如,如果文件filename
存在,不是常规文件,或者已经是符号链接)。
你怎么看?