Je voudrais pouvoir simuler en toute sécurité open
avec O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW
et O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW
sur les systèmes qui ne supportent pas O_NOFOLLOW
. Je peux un peu réaliser ce que je vous demande avec:Quelle est une bonne façon de simuler O_NOFOLLOW sur des systèmes sans ce drapeau?
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);
mais j'introduire une condition de course et peut-être un problème de sécurité.
je pensé à créer peut-être un fichier fictif avec seul l'utilisateur étant capable d'écrire, un peu comme touch
ing filename
, faire le chèque lstat
, puis en utilisant chmod
après avoir fini d'écrire (pour corriger les bits de mode de fichier), mais je pourrais être en train de négliger quelque chose de majeur (par exemple si le fichier à filename
existe, n'est pas un fichier régulier, ou est déjà un lien symbolique).
Qu'en pensez-vous?