Por que o strace retorna tantas chamadas executadas com o código de retorno ENOENT?

5

Eu queria usar o strace para ver o que estava acontecendo quando eu faço o `hadoop fs -ls ', então executei o comando:

strace -f -e trace=execve hadoop fs -ls /stg o que resultou em muitos resultados como este:

[pid 187050] execve("/opt/sas/app/platform/lsf/8.0/linux2.6-glibc2.3-x86_64/etc/setsid", ["setsid", "bash", "-c", "echo $$"], [/* 78 vars */]) = -1 ENOENT (No such file or directory)
[pid 187050] execve("/opt/sas/app/platform/lsf/8.0/linux2.6-glibc2.3-x86_64/bin/setsid", ["setsid", "bash", "-c", "echo $$"], [/* 78 vars */]) = -1 ENOENT (No such file or directory)
[pid 187050] execve("/opt/dca/bin/setsid", ["setsid", "bash", "-c", "echo $$"], [/* 78 vars */]) = -1 ENOENT (No such file or directory)
[pid 187050] execve("/usr/local/greenplum-cc-web/./bin/setsid", ["setsid", "bash", "-c", "echo $$"], [/* 78 vars */]) = -1 ENOENT (No such file or directory)
[pid 187050] execve("/usr/lib64/qt-3.3/bin/setsid", ["setsid", "bash", "-c", "echo $$"], [/* 78 vars */]) = -1 ENOENT (No such file or directory)
[pid 187050] execve("/usr/local/bin/setsid", ["setsid", "bash", "-c", "echo $$"], [/* 78 vars */]) = -1 ENOENT (No such file or directory)
[pid 187050] execve("/bin/setsid", ["setsid", "bash", "-c", "echo $$"], [/* 78 vars */]) = -1 ENOENT (No such file or directory)
[pid 187050] execve("/usr/bin/setsid", ["setsid", "bash", "-c", "echo $$"], [/* 78 vars */]) = 0

Por que haveria tantos -1 ENOENT (No such file or directory)resultados?

jcm
fonte

Respostas:

9

Ele está tentando executar o programa chamando todos os locais em potencial, $PATHsem o pré-aviso de onde o programa está. Isso é completamente normal, pois fazer algo como stat()isso execve()é considerado uma condição de corrida pelas práticas recomendadas de segurança em muitas lojas de software.

Andrew Domaszek
fonte
11
A libc funciona execlp()e execvp()implementa essa PATHpesquisa. O tipo de condição de corrida é conhecido como "TOCTOU", time-of-check tempo de uso: CWE-367
mr.spuratic
11
Além disso, não faz sentido fazer as verificações primeiro. Você apenas geraria uma chamada de sistema extra.
22615 Simon Simonter
Se bem me lembro, execlp e execvp chamam um shell para fazer a pesquisa de caminho para você (da mesma maneira).
Andrew Domaszek 12/03/2015
@AndrewDomaszek Nenhuma das execfunções chama um shell. São todas as funções da biblioteca C envolvendo a execvechamada do sistema. A execvechamada da biblioteca é um invólucro muito fino, as outras cinco execfunções precisam de mais lógica e provavelmente são implementadas na parte superior da execvechamada da biblioteca. A systemfunção de biblioteca, no entanto, chama um shell.
kasperd
IEEE Std 1003.1-2008 "Nos casos em que os outros membros da família de funções exec falhem e configuram errno como [ENOEXEC], as funções execlp () e execvp () devem executar um interpretador de comando e o ambiente do comando executado será como se o processo invocado o utilitário sh usando execl () da seguinte forma [..]" Spec sugere o contrário ...
Andrew Domaszek