From cda41b2445832d1c5f364ba501d5ef06b78f6aa3 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Thu, 22 Aug 2019 11:59:43 +0200 Subject: [PATCH] Ancora su fexecve/execveat --- fileio.tex | 36 ++++++++++++++++++++++++++++++------ listati/fexecve.c | 1 + 2 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 listati/fexecve.c 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); -- 2.30.2