warum wird openat() benötigt, um einen zweistufigen Race Condition mit stat und dann open() zu vermeiden?

warum wird openat() benötigt, um einen zweistufigen Race Condition mit stat und dann open() zu vermeiden?

Die Erklärung bei

http://man7.org/linux/man-pages/man2/open.2.html

über die Notwendigkeit openatlautet auszugsweise:

openat() allows an application to avoid race conditions that
   could occur when using open() to open files in directories other than
   the current working directory.  These race conditions result from the
   fact that some component of the directory prefix given to open()
   could be changed in parallel with the call to open().  Suppose, for
   example, that we wish to create the file path/to/xxx.dep if the file
   path/to/xxx exists.  The problem is that between the existence check
   and the file creation step, path or to (which might be symbolic
   links) could be modified to point to a different location.

Ich verstehe nicht, warum dieses Rennen ein Problem ist. Wenn eine App die Existenz einer Datei prüfen und in diesem Fall eineandersDatei, dann sind das natürlich zwei Schritte, und die App sollte und kann sicherstellen, dass nichts dazwischen kommt. Nur wenn ein einzelner Aufruf open()einen Race Condition verursachen könnte, könnte ein anderer Systemaufruf wie openat()erforderlich sein. Andernfalls ist dies nicht durch Systemaufrufe zu lösen, sondern liegt in der Verantwortung der Anwendung.

Was verstehe ich hier nicht?

Antwort1

Das Race bezieht sich nur auf Dateien, die sich nicht im aktuellen Verzeichnis befinden. Der relative Pfad, den Sie an openat() übergeben, könnte einen symbolischen Link enthalten, der auf ein anderes Verzeichnis als das erwartete verweist.

Wenn Sie open() nur mit Dateien im aktuellen Verzeichnis verwenden (nachdem Sie sichergestellt haben, dass Sie dort sind, wo Sie sein möchten), vermeiden Sie dieses Problem.

verwandte Informationen