X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filedir.tex;h=b07727757730ca5020d5ea577286a2d6cc375a33;hp=776ff474c8c07e58a4e77020f4384393ccd0c700;hb=f486510bed043527644e38f161d1bf69e09039e9;hpb=94128b2e2e19d3fe398e7c53f5f8d72767c6b1d9 diff --git a/filedir.tex b/filedir.tex index 776ff47..b077277 100644 --- a/filedir.tex +++ b/filedir.tex @@ -2992,7 +2992,7 @@ verso un file diverso, ottenendo, se il programma sotto attacco ne ha la capacità, un accesso privilegiato.\footnote{dal kernel 3.6 sono state introdotte delle contromisure, illustrate in sez.~\ref{sec:procadv_security_misc}, che rendono impraticabili questo tipo - di attacchi ma questa non è una buona scusa per ignorare il problema.} + di attacchi, ma questa non è una buona scusa per ignorare il problema.} \itindend{symlink~attack} @@ -3144,7 +3144,6 @@ prototipo è: \end{errlist}} \end{funcproto} - Come per \func{mktemp} anche in questo caso \param{template} non può essere una stringa costante. La funzione apre un file in lettura/scrittura con la funzione \func{open}, usando l'opzione \const{O\_EXCL} (si veda @@ -3170,14 +3169,43 @@ specificamente dalla \acr{glibc},\footnote{la funzione è stata introdotta \func{mkstemp}.} \end{funcproto} \noindent la cui sola differenza è la presenza dell'ulteriore argomento -\var{flags} che consente di specificare i flag da passare ad \func{open} -nell'apertura del file. +\var{flags} che consente di specificare alcuni ulteriori flag (come +\const{O\_APPEND}, \const{O\_CLOEXEC}, \const{O\_SYNC}, il cui significato +vedremo in sez.~\ref{sec:file_open_close}) da passare ad \func{open} +nell'apertura del file.\footnote{si tenga presente che \func{mkostemp} + utilizza già \const{O\_CREAT}, \const{O\_EXCL} e \const{O\_RDWR}, che non è + il caso di reindicare, dato che ciò potrebbe portare ad errori in altri + sistemi operativi.} + +Di queste due funzioni sono state poi introdotte, a partire dalla \acr{glibc} +2.11 due varianti, \funcd{mkstemps} e \funcd{mkostemps}, che consentono di +indicare anche un suffisso, i loro prototipi sono: + +\begin{funcproto}{ +\fhead{stlib.h} +\fdecl{int mkstemps(char *template, int suffixlen)} +\fdesc{Apre un file temporaneo.} +\fdecl{int mkostemps(char *template, int suffixlen, int flags)} +\fdesc{Apre un file temporaneo.} +} + +{Le funzioni hanno gli stessi valori di ritorno e gli stessi errori di + \func{mkstemp} con lo stesso significato, tranne \errval{EINVAL} che viene + restituito se \param{template} non è di lunghezza pari ad almeno + $6+$\param{suffixlen} ed i 6 caratteri prima del suffisso non sono + \code{XXXXXX}.} +\end{funcproto} +Le due funzioni, un'estensione non standard fornita dalla \acr{glibc}, sono +identiche a \funcd{mkstemp} e \funcd{mkostemp}, ma consentono di avere un nome +del file nella forma \texttt{prefissoXXXXXXsuffisso} dove la lunghezza del +suffisso deve essere indicata con \param{suffixlen}. -In OpenBSD è stata introdotta un'altra funzione simile alle precedenti, -\funcd{mkdtemp}, che crea invece una directory temporanea;\footnote{la - funzione è stata introdotta nella \acr{glibc} a partire dalla versione - 2.1.91 ed inserita nello standard POSIX.1-2008.} il suo prototipo è: +Infine con OpenBSD è stata introdotta un'altra funzione simile alle +precedenti, \funcd{mkdtemp}, che crea invece una directory +temporanea;\footnote{la funzione è stata introdotta nella \acr{glibc} a + partire dalla versione 2.1.91 ed inserita nello standard POSIX.1-2008.} il +suo prototipo è: \begin{funcproto}{ \fhead{stlib.h} @@ -3196,11 +3224,10 @@ In OpenBSD è stata introdotta un'altra funzione simile alle precedenti, La funzione crea una directory temporanea il cui nome è ottenuto sostituendo le \code{XXXXXX} finali di \param{template} con permessi \code{0700} (si veda sez.~\ref{sec:file_perm_overview} per i dettagli). Dato che la creazione della -directory è sempre esclusiva i precedenti problemi di \textit{race condition} +directory è sempre atomica i precedenti problemi di \textit{race condition} non si pongono. - \section{La manipolazione delle caratteristiche dei file} \label{sec:file_infos} @@ -3285,38 +3312,50 @@ abbastanza chiara, vale la pena illustrare maggiormente il significato dei campi di \struct{stat} su cui non torneremo in maggior dettaglio nel resto di questa sezione: \begin{itemize*} - \item Il campo \var{st\_nlink} contiene il numero di \textit{hard link} che fanno riferimento al file (il cosiddetto \textit{link count}) di cui abbiamo già parlato in numerose occasioni. - \item Il campo \var{st\_ino} contiene il numero di \textit{inode} del file, quello viene usato all'interno del filesystem per identificarlo e che può essere usato da un programma per determinare se due \textit{pathname} fanno riferimento allo stesso file. - \item Il campo \var{st\_dev} contiene il numero del dispositivo su cui risiede il file (o meglio il suo filesystem). Si tratta dello stesso numero che si usa con \func{mknod} e che può essere decomposto in \textit{major number} e \textit{minor number} con le macro \macro{major} e \macro{minor} viste in sez.~\ref{sec:file_mknod}. - \item Il campo \var{st\_rdev} contiene il numero di dispositivo associato al file stesso ed ovviamente ha un valore significativo soltanto quando il file è un dispositivo a caratteri o a blocchi. - \item Il campo \var{st\_blksize} contiene la dimensione dei blocchi di dati usati nell'I/O su disco, che è anche la dimensione usata per la bufferizzazione dei dati dalle librerie del C per l'interfaccia degli \textit{stream}. Leggere o scrivere blocchi di dati in dimensioni inferiori a questo valore è inefficiente in quanto le operazioni su disco usano comunque trasferimenti di questa dimensione. - \end{itemize*} -% TODO trattare anche statx, aggiunta con il kernel 4.11 (vedi -% https://lwn.net/Articles/707602/ e -% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a528d35e8bfcc521d7cb70aaf03e1bd296c8493f) +Nell'evoluzione del kernel la \textit{system call} che fornisce \func{stat} è +stata modificata più volte per tener conto dei cambiamenti fatti alla +struttura \struct{stat},\footnote{questo ha significato l'utilizzo a basso + livello di diverse \textit{system call} e diverse versioni della struttura.} +in particolare a riguardo ai tempi dei file, di cui è stata aumentata la +precisione (torneremo su questo in sez.~\ref{sec:file_file_times}) ma anche +per gli aggiornamenti fatti ai campi \var{st\_ino}, \var{st\_uid} e +\var{st\_gid}. Sulle piattaforme a 32 bit questi cambiamenti, che han visto un +aumento delle dimensioni dei campi della struttura per adattarli alle nuove +esigenze, sono mascherati dalla \acr{glibc} che attraverso \func{stat} invoca +la versione più recente della \textit{system call} e reimpacchetta i dati se +questo è necessario per eseguire dei vecchi programmi. Nelle piattaforme a 64 +bit invece è presente un'unica versione della \textit{system call} e la +struttura \struct{stat} ha campi di dimensione sufficiente. + +Infine a partire dal kernel 2.6.16 è stata introdutta una ulteriore funzione +della famiglia, \func{fstatat} che consente di trattare con sicurezza i +\textit{pathname} relativi, la tratteremo in sez.~\ref{sec:file_openat}, +insieme alla nuova \textit{system call} \func{statx}, introdotta dal kernel +4.11 per estendere l'interfaccia di \func{stat} e le informazioni che essa può +restituire. \subsection{I tipi di file} @@ -3329,14 +3368,6 @@ tab.~\ref{tab:file_file_types}). Il tipo di file viene ritornato dalle funzioni della famiglia \func{stat} all'interno del campo \var{st\_mode} di una struttura \struct{stat}. -Il campo \var{st\_mode} è una maschera binaria in cui l'informazione viene -suddivisa nei vari bit che compongono, ed oltre a quelle sul tipo di file, -contiene anche le informazioni relative ai permessi su cui torneremo in -sez.~\ref{sec:file_perm_overview}. Dato che i valori numerici usati per -definire il tipo di file possono variare a seconda delle implementazioni, lo -standard POSIX definisce un insieme di macro che consentono di verificare il -tipo di file in maniera standardizzata. - \begin{table}[htb] \centering \footnotesize @@ -3358,6 +3389,14 @@ tipo di file in maniera standardizzata. \label{tab:file_type_macro} \end{table} +Il campo \var{st\_mode} è una maschera binaria in cui l'informazione viene +suddivisa nei vari bit che compongono, ed oltre a quelle sul tipo di file, +contiene anche le informazioni relative ai permessi su cui torneremo in +sez.~\ref{sec:file_perm_overview}. Dato che i valori numerici usati per +definire il tipo di file possono variare a seconda delle implementazioni, lo +standard POSIX definisce un insieme di macro che consentono di verificare il +tipo di file in maniera standardizzata. + Queste macro vengono usate anche da Linux che supporta pure le estensioni allo standard per i collegamenti simbolici e i socket definite da BSD.\footnote{le ultime due macro di tab.~\ref{tab:file_type_macro}, che non sono presenti