From: Simone Piccardi Date: Thu, 22 Aug 2019 09:59:43 +0000 (+0200) Subject: Ancora su fexecve/execveat X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=cda41b2445832d1c5f364ba501d5ef06b78f6aa3;p=gapil.git Ancora su fexecve/execveat --- diff --git a/fileio.tex b/fileio.tex index b41f6bc..5444348 100644 --- a/fileio.tex +++ b/fileio.tex @@ -2743,23 +2743,23 @@ descriptor al posto di un \textit{pathname}; il suo prototipo è: oltre a tutti gli errori già visti per \func{execve}.} \end{funcproto} -La funzione esegue il programma contenuto nel file (su cui il chiamante abbia -il permesso di esecuzione) corrispondente a \param{fd}; questo deve essere -stato ottenuto aprendo il relativo eseguibile in sola lettura o con +La funzione esegue il programma contenuto nel file (su cui il chiamante deve +avere il permesso di esecuzione) corrispondente a \param{fd}; questo deve +essere stato ottenuto aprendo il relativo eseguibile in sola lettura o con \const{O\_PATH}. Questa funzione fino al kernel 3.19 veniva realizzata nella -\acr{glibc} usando il filesystem \file{proc} per ottenere da \param{fd} il +\acr{glibc} usando il filesystem \file{/proc} per ottenere da \param{fd} il file corrispondente, in maniera analoga a quanto visto per l'esempio di fig.~\ref{fig:initfile}. La funzione di sistema \funcd{execveat} è stata introdotta proprio per rendere più sicura l'esecuzione ed evitare la necessità di avere disponibile -\file{proc} per poter usare \func{fexecve}, il suo prototipo è: +\file{/proc} per poter usare \func{fexecve}, il suo prototipo è: \begin{funcproto}{ \fhead{unistd.h} \fdecl{int execveat(int dirfd, const char *pathname, char *const argv[], \\ \phantom{int execveat(}char *const envp[], int flags)} -\fdesc{Esegue un programma.} +\fdesc{Esegue un programma relativo ad una directory.} } {La funzione non ritorna in caso di successo e ritorna $-1$ per un errore, nel @@ -2778,6 +2778,30 @@ più sicura l'esecuzione ed evitare la necessità di avere disponibile } \end{funcproto} +La funzione segue la sintassi delle \textit{at-functions} per indicare il file +da eseguire, e per il resto si comporta esattamente con come \func{execve}; è +pertanto possibile indicare il programma da eseguire sia con un +\textit{pathname} assoluto che relativo, ed anche con un \textit{pathname} +relativo alla directory indicata da \param{dirfd}. Inoltre usando per +\param{flags} il valore \const{AT\_EMPTY\_PATH} si può indicare direttamente +il file con il file descriptor \param{dirfd} ottenendo il comportamento di +\func{fexecve}, che è equivalnente all'esecuzione di: +\includecodesnip{listati/fexecve.c} l'unico altro valore utilizzabile per +\param{flags} è \const{AT\_SYMLINK\_NOFOLLOW} che fa fallire la funzione con +un errore di \errval{ELOOP} se il file indicato è un link simbolico. + +Quando si usano \func{execveat} o \func{fexecve} per eseguire un programma +attraverso un file descriptor è opportuno impostare sempre sullo stesso il +flag di \textit{close-on-exec}, in modo che questo venga automaticamente +chiuso all'esecuzione. Questo evita di consumare inutilmente un file +descriptor (un programma non ha bisogno di un riferimento a se stesso), ma +soprattutto evita problemi in caso di un eventuale uso ricorsivo di queste +funzioni che potrebbe portare, restando aperto ogni volta un ulteriore file +descriptor, all'esaurimento degli stessi. + + + + % TODO: manca prototipo e motivazione di fexecve, da trattare qui in quanto % inserita nello stesso standard e da usare con openat, vedi % http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf diff --git a/listati/fexecve.c b/listati/fexecve.c new file mode 100644 index 0000000..d06fc7e --- /dev/null +++ b/listati/fexecve.c @@ -0,0 +1 @@ +execveat(fd, "", argv, envp, AT_EMPTY_PATH);