fexecve(3) Exécuter un programme indiqué par un descripteur de fichier

SYNOPSIS

#include <unistd.h>


int fexecve(int fd, char *const argv[], char *const envp[]);

Exigences de macros de test de fonctionnalités pour la glibc (consultez feature_test_macros(7)) :

fexecve() :

Depuis la glibc 2.10 :
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
Avant la glibc 2.10 :
_GNU_SOURCE

DESCRIPTION

fexecve() effectue la même tâche que execve(2), excepté que le fichier à exécuter est indiqué a l’aide d’un descripteur de fichier, fd au lieu d'un chemin. Le descripteur de fichier fd doit être ouvert en lecture seule, et l'appelant doit avoir les permissions nécessaires pour exécuter le fichier lié au descripteur de fichier.

VALEUR RENVOYÉE

En cas de réussite, la fonction fexecve() ne revient jamais. En cas d'erreur, la fonction renvoie -1 et errno est définie.

ERREURS

Les erreurs sont les mêmes que pour execve(2), avec en plus :
EINVAL
fd n'est pas un descripteur de fichier valable, ou argv est NULL, ou envp est NULL.
ENOSYS
Impossible d'accéder au système de fichiers /proc.

VERSIONS

fexecve() est disponible depuis la glibc 2.3.2.

CONFORMITÉ

POSIX.1-2008. Cette fonction n'est pas spécifiée dans POSIX.1-2001 et n'est que rarement disponible sur d'autres systèmes. Cette fonction est spécifiée dans POSIX.1-2008.

NOTES

Sous Linux, fexecve() est implémentée avec le système de fichiers proc(5), /proc doit donc être monté et disponible lors des appels à fexecve().

Si fd est un descripteur de fichier qui réfère un script et a été marqué avec l'attribut « close-on-exec » (voir FD_CLOEXEC dans fcntl(2)), fexecve() échouera à exécuter le script, puisque qu'au moment où l'interpréteur essaie d'accéder au fichier du script, fd a déjà été fermé.

L’idée derrière fexecve() est de permettre à l’appelant de vérifier (avec une somme de contrôle) le contenu d’un exécutable avant de l’exécuter. Juste ouvrir le fichier et calculer la somme de contrôle du contenu avant de faire un execve() ne suffirait pas puisque, entre les deux étapes, le nom du fichier, ou un préfixe de répertoire dans le nom de chemin, pourrait avoir été modifié (par exemple en modifiant la cible d’un lien symbolique). fexecve() n’atténue pas le problème que le contenu d’un fichier pourrait être modifié entre le calcul de la somme de contrôle et l’appel à fexecve(). Pour cela, la solution est de s’assurer que les permissions sur le fichier l’empêchent d’être modifié par un utilisateur malveillant.

COLOPHON

Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION

Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <http://manpagesfr.free.fr/> (2003-2006). Florentin Duneau et l'équipe francophone de traduction de Debian (2006-2009).

Veuillez signaler toute erreur de traduction en écrivant à <[email protected]> ou par un rapport de bogue sur le paquet manpages-fr.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C <section> <page_de_man> ».