web-dev-qa-db-fra.com

Est-ce que "CP --NO-Clobber" vulnérable à la condition de race?

La page man pour cp(1) dit

--no-clobber Ne pas écraser un fichier existant

Cependant, le scénario suivant ne serait-il pas possible?

  1. cp vérifie l'existence du fichier, supposons que le fichier n'existe pas (encore)
  2. Un autre processus écrit sur le même chemin, alors il y a maintenant des données écrites dans le fichier précédemment non existant.
  3. Puisque cp n'est pas au courant du fichier maintenant existant, il écrase les données

Est cp --no-clobber vulnérable à cette condition de course? Et sinon, comment cp évite la situation ci-dessus?

34
finefoot

cp n'est pas vulnérable à cette condition de course. Lorsque --no-clobber est défini, il vérifie si la destination existe déjà; Si cela détermine cela ne le fait pas, et il devrait donc procéder à la copie, il se souvient qu'il est censé copier dans un nouveau fichier. Lorsque le temps vient d'ouvrir le fichier de destination, il l'ouvre avec des indicateurs qui appliquent sa création , O_CREAT et O_EXCL ; Le système d'exploitation vérifie ensuite que le fichier n'existe pas tout en ouvrant et échoue (EEXIST) si cela le fait.

56
Stephen Kitt