execveat(2) System Calls Manual execveat(2)

execveat - Exécuter un programme relatif au descripteur de fichier d'un répertoire

Bibliothèque C standard (libc, -lc)

#include <linux/fcntl.h>      /* Définition des constantes AT_* */
#include <unistd.h>
int execveat(int dirfd, const char *pathname,
             char *const _Nullable argv[],
             char *const _Nullable envp[],
             int flags);

L'appel système execveat() exécute le programme auquel renvoient dirfd et pathname. Il opère exactement de la même manière que execve(2), excepté les différences décrites dans cette page de manuel.

Si le nom de chemin fourni dans pathname est relatif, il est interprété relativement au répertoire référencé par le descripteur de fichier dirfd (plutôt que relativement au répertoire de travail courant du processus appelant, comme cela est fait par execve(2) pour un chemin relatif).

Si pathname est relatif et que dirfd est la valeur spéciale AT_FDCWD, pathname est interprété relativement au répertoire de travail courant du processus appelant (comme avec execve(2)).

Si pathname est absolu, alors dirfd est ignoré.

Si pathname est une chaîne vide et si le drapeau AT_EMPTY_PATH est indiqué, le descripteur de fichier dirfd spécifie le fichier à exécuter (c-est-à-dire que dirfd renvoie à un fichier exécutable et non à un répertoire).

L'argument flags est un masque de bit qui peut comprendre zéro ou plusieurs des drapeaux suivants :

Si pathname est une chaîne vide, opérer sur le fichier auquel renvoie dirfd (qu'on peut obtenir en utilisant le drapeau O_PATH de open(2)).
Si le fichier identifié par dirfd est un pathname non NULL est un lien symbolique, l'appel échoue avec l'erreur ELOOP.

En cas de réussite, execveat() ne renvoie rien. En cas d'échec il renvoie -1 et errno est positionné pour indiquer l'erreur.

Les mêmes erreurs qui apparaissent pour execve(2) peuvent apparaître pour execveat(2). Les erreurs supplémentaires suivantes peuvent également se produire pour execveat(2) :

est relatif mais dirfd n'est ni AT_FDCWD, ni un descripteur de fichier valable.
flags contient un attribut non valable.
flags comprend AT_SYMLINK_NOFOLLOW et le fichier identifié par dirfd et un pathname non NULL est un lien symbolique.
Le programme identifié par dirfd et pathname exige d'utiliser un interpréteur (tel qu'un script qui commence par « #! », mais le descripteur de fichier dirfd a été ouvert avec le drapeau O_CLOEXEC, d'où il s'en suit que le fichier du programme est inaccessible à l'interpréteur lancé. Voir BOGUES.
pathname est relatif et dirfd est un descripteur de fichier faisant référence à un fichier qui n'est pas un dossier.

Linux.

Linux 3.19, glibc 2.34.

Outre les raisons expliquées dans openat(2), l'appel système execveat() est également nécessaire pour permettre à fexecve(3) d'être implémenté sur des systèmes où aucun système de fichiers /proc n'est monté.

Si on lui demande d'exécuter un fichier script, argv[0] qui est passé à l'interpréteur de script est une chaîne sous la forme /dev/fd/N ou /dev/fd/N/P, où N est le numéro du descripteur de fichier passé via l'argument dirfd. Une chaîne sous la première forme apparaît quand AT_EMPTY_PATH est utilisé. Une chaîne sous la deuxième forme apparaît quand le script est indiqué via dirfd et pathname ; dans ce cas, P est la valeur donnée à pathname.

Pour les mêmes raisons décrites dans fexecve(3), l'usage naturel quand on utilise execveat() est de positionner l'attribut close-on-exec sur dirfd (mais voir BOGUES).

L'erreur ENOENT décrite ci-dessus signifie qu'il n'est pas possible de positionner l'attribut close-on-exec sur le descripteur de fichier donné à l'appel sous la forme :


execveat(fd, "", argv, envp, AT_EMPTY_PATH);

Cependant, l'impossibilité de positionner l'attribut close-on-exec signifie qu'un descripteur de fichier renvoyant à un script a une fuite via le script lui-même. Outre qu'elle gaspille le descripteur de fichier, cette fuite peut l'épuiser dans des scénari où les scripts utilisent execveat() de manière récursive.

execve(2), openat(2), fexecve(3)

La traduction française de cette page de manuel a été créée par Christophe Blaess https://www.blaess.fr/christophe/, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.

30 mars 2023 Pages du manuel de Linux 6.05.01