¿Por qué se necesita openat() para evitar una condición de carrera de dos pasos con stat y luego open()?

¿Por qué se necesita openat() para evitar una condición de carrera de dos pasos con stat y luego open()?

La explicación en

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

sobre por qué openates necesario, lee en parte:

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.

No entiendo por qué esta carrera es un problema. Si una aplicación quiere verificar la existencia de algún archivo y, de ser así, crear undiferentearchivo, entonces, por supuesto, estos son dos pasos, y la aplicación debe y puede garantizar que nada interfiera en el medio. Solo si una sola llamada a pudiera causar una condición de carrera, podría ser necesaria open()alguna otra llamada al sistema, como la . openat()De lo contrario, esto no corresponde a las llamadas al sistema, sino que es responsabilidad de la aplicación.

¿Qué no estoy entendiendo aquí?

Respuesta1

La carrera se refiere únicamente a archivos que no están en el directorio actual. La ruta relativa que está pasando a openat() podría contener un enlace simbólico que apunte a un directorio diferente al que esperaba.

Si solo usa open() con archivos en el directorio actual (después de asegurarse de que está donde quiere estar), evitará este problema.

información relacionada