por que o openat () é necessário para evitar uma condição de corrida em duas etapas com stat e, em seguida, open ()?

1

A explicação em

link

sobre por que openat é necessário, lê-se em 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.

Eu não entendo porque esta corrida é um problema. Se um aplicativo quiser verificar a existência de algum arquivo e, em caso afirmativo, criar um arquivo diferente , é claro que estas são duas etapas, e o aplicativo deve e pode garantir que nada interfira no meio. Somente se uma única chamada para open() puder causar uma condição de corrida, talvez seja necessário algum outro syscall, como openat() . Caso contrário, isso não é para syscalls para resolver, mas é uma responsabilidade do aplicativo.

O que não estou entendendo aqui?

    
por user322908 16.02.2016 / 11:07

1 resposta

0

A corrida está se referindo apenas aos arquivos que não estão no diretório atual. O caminho relativo que você está passando para openat () pode conter um symlink que aponta para um diretório diferente daquele que você está esperando.

Se você só usa open () com arquivos no diretório atual (depois de ter certeza de estar onde você quer estar), você evita esse problema.

    
por 16.02.2016 / 11:47