Я хотел был бы безопасно смоделировать open
с O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW
и O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW
на системах, которые не поддерживают 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
существует, не является обычным файлом или уже является символической ссылкой).
Как вы думаете?