Documentati O_PATH (fine) e O_NOFOLLOW
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 6 Nov 2018 22:09:28 +0000 (23:09 +0100)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 6 Nov 2018 22:09:28 +0000 (23:09 +0100)
filedir.tex
fileio.tex

index c78d42a926d6ad8f78434f421b6ec042e7c77ffc..90e731ed20cb0229a536f63412314f1814abc5eb 100644 (file)
@@ -407,7 +407,7 @@ per i dati in essi contenuti.
 \end{figure}
 
 Se si va ad esaminare con maggiore dettaglio la strutturazione
-dell'informazione all'interno del filesystem \textsl{ext2}, tralasciando i
+dell'informazione all'interno del filesystem \acr{ext2}, tralasciando i
 dettagli relativi al funzionamento del filesystem stesso come la
 strutturazione in gruppi dei blocchi, il \textit{superblock} e tutti i dati di
 gestione possiamo esemplificare la situazione con uno schema come quello
@@ -514,7 +514,7 @@ tre, in quanto adesso sarà referenziata anche dalla voce ``\texttt{..}'' di
 \itindend{inode}
 
 
-\subsection{Alcuni dettagli sul filesystem \textsl{ext2} e successori}
+\subsection{Alcuni dettagli sul filesystem \acr{ext2} e successori}
 \label{sec:file_ext2}
 
 Benché non esista ``il'' filesystem di Linux, dato che esiste un supporto
@@ -525,7 +525,7 @@ grande sviluppo e diverse evoluzioni, fra cui l'aggiunta del
 \textit{journaling} con il passaggio ad \acr{ext3}, che probabilmente è ancora
 il filesystem più diffuso, ed una serie di ulteriori miglioramenti con il
 successivo \acr{ext4}. In futuro è previsto che questo debba essere sostituito
-da un filesystem completamente diverso, \acr{btrfs}, che dovrebbe diventare il
+da un filesystem completamente diverso, \acr{Btrfs}, che dovrebbe diventare il
 filesystem standard di Linux, ma questo al momento è ancora in fase di
 sviluppo.\footnote{si fa riferimento al momento dell'ultima revisione di
   questo paragrafo, l'inizio del 2012.}
@@ -597,8 +597,8 @@ lo schema in fig.~\ref{fig:file_ext2_dirs}; in questo modo è possibile
 implementare nomi per i file anche molto lunghi (fino a 1024 caratteri) senza
 sprecare spazio disco.
 
-Con l'introduzione del filesystem \textit{ext3} sono state introdotte diverse
-modifiche strutturali, la principale di queste è quella che \textit{ext3} è un
+Con l'introduzione del filesystem \acr{ext3} sono state introdotte diverse
+modifiche strutturali, la principale di queste è quella che \acr{ext3} è un
 filesystem \textit{journaled}, è cioè in grado di eseguire una registrazione
 delle operazioni di scrittura su un giornale (uno speciale file interno) in
 modo da poter garantire il ripristino della coerenza dei dati del
@@ -610,7 +610,7 @@ filesystem\footnote{si noti bene che si è parlato di dati \textsl{del}
 della corrente o di crollo del sistema che abbia causato una interruzione
 della scrittura dei dati sul disco.
 
-Oltre a questo \textit{ext3} introduce ulteriori modifiche volte a migliorare
+Oltre a questo \acr{ext3} introduce ulteriori modifiche volte a migliorare
 sia le prestazioni che la semplicità di gestione del filesystem, in
 particolare per le directory si è passato all'uso di alberi binari con
 indicizzazione tramite \textit{hash} al posto delle \textit{linked list} che
@@ -2363,8 +2363,8 @@ ecc.), e consente di evitare una successiva chiamata a \func{lstat} (vedi
 sez.~\ref{sec:file_stat}) per determinarlo. I suoi possibili valori sono
 riportati in tab.~\ref{tab:file_dtype_macro}. Si tenga presente che questo
 valore è disponibile solo per i filesystem che ne supportano la restituzione
-(fra questi i più noti sono \textsl{btrfs}, \textsl{ext2}, \textsl{ext3}, e
-\textsl{ext4}), per gli altri si otterrà sempre il valore
+(fra questi i più noti sono \acr{Btrfs}, \acr{ext2}, \acr{ext3}, e
+\acr{ext4}), per gli altri si otterrà sempre il valore
 \const{DT\_UNKNOWN}.\footnote{inoltre fino alla versione 2.1 della
   \acr{glibc}, pur essendo il campo \var{d\_type} presente, il suo uso non era
   implementato, e veniva restituito comunque il valore \const{DT\_UNKNOWN}.}
@@ -4662,8 +4662,8 @@ in particolare accade che:
   quando l'\ids{UID} effettivo del processo è zero.
 \end{enumerate*}
 
-Per alcuni filesystem\footnote{i filesystem più comuni (\textsl{ext2},
-  \textsl{ext3}, \textsl{ext4}, \textsl{xfs}, \texttt{btrfs}) supportano
+Per alcuni filesystem\footnote{i filesystem più comuni (\acr{ext2},
+  \acr{ext3}, \acr{ext4}, \acr{XFS}, \acr{Btrfs}) supportano
   questa caratteristica, che è mutuata da BSD.} è inoltre prevista
 un'ulteriore misura di sicurezza, volta a scongiurare l'abuso dei bit
 \acr{suid} e \acr{sgid}; essa consiste nel cancellare automaticamente questi
@@ -4986,11 +4986,11 @@ che ogni valore precedente sia sovrascritto.
 
 Si tenga presente che non tutti i filesystem supportano gli \textit{Extended
   Attributes}; al momento della scrittura di queste dispense essi sono
-presenti solo sui vari \textsl{extN}, \textsl{ReiserFS}, \textsl{JFS},
-\textsl{XFS}, \textsl{Btrfs}, \textsl{Lustre} e \textsl{OCFS2}.  Inoltre a
+presenti solo sui vari \acr{extN}, \acr{ReiserFS}, \acr{JFS},
+\acr{XFS}, \acr{Btrfs}, \acr{Lustre} e \acr{OCFS2}.  Inoltre a
 seconda della implementazione ci possono essere dei limiti sulla quantità di
 attributi che si possono utilizzare.\footnote{ad esempio nel caso di
-  \textsl{ext2} ed \textsl{ext3} è richiesto che essi siano contenuti
+  \acr{ext2} ed \acr{ext3} è richiesto che essi siano contenuti
   all'interno di un singolo blocco, pertanto con dimensioni massime pari a
   1024, 2048 o 4096 byte a seconda delle dimensioni di quest'ultimo impostate
   in fase di creazione del filesystem, mentre con \textsl{XFS} e
@@ -6172,14 +6172,14 @@ che ne fanno parte. Si può così porre dei limiti sul contenuto di un ramo di
 albero.
 
 Il meccanismo prevede che per ciascun filesystem che supporta le quote disco
-(i vari \textit{extN}, \textit{btrfs}, \textit{XFS}, \textit{JFS},
-\textit{ReiserFS}) il kernel provveda sia a mantenere aggiornati i dati
-relativi al consumo delle risorse da parte degli utenti e dei gruppi (e del
-progetto), che a far rispettare i limiti imposti dal sistema, con la
-generazione di un errore di \errcode{EDQUOT} per tutte le operazioni sui file
-che porterebbero ad un superamento degli stessi. Si tenga presente che questi
-due compiti sono separati, il primo si attiva al montaggio del filesystem con
-il supporto per le quote, il secondo deve essere abilitato esplicitamente.
+(i vari \acr{extN}, \acr{Btrfs}, \acr{XFS}, \acr{JFS}, \acr{ReiserFS}) il
+kernel provveda sia a mantenere aggiornati i dati relativi al consumo delle
+risorse da parte degli utenti e dei gruppi (e del progetto), che a far
+rispettare i limiti imposti dal sistema, con la generazione di un errore di
+\errcode{EDQUOT} per tutte le operazioni sui file che porterebbero ad un
+superamento degli stessi. Si tenga presente che questi due compiti sono
+separati, il primo si attiva al montaggio del filesystem con il supporto per
+le quote, il secondo deve essere abilitato esplicitamente.
 
 Per il mantenimento dei dati di consumo delle risorse vengono usati due file
 riservati nella directory radice del filesystem su cui si sono attivate le
@@ -6776,7 +6776,7 @@ librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  version libcap lcap clear ncap caps pag capgetp CapInh CapPrm RT
 % LocalWords:  fffffeff CapEff getcap scheduling lookup  dqinfo SETINFO GETFMT
 % LocalWords:  NEWNS unshare nice NUMA ioctl journaling close XOPEN fdopendir
-% LocalWords:  btrfs mkostemp extN ReiserFS JFS Posix usrquota grpquota EDQUOT
+% LocalWords:  Btrfs mkostemp extN ReiserFS JFS Posix usrquota grpquota EDQUOT
 % LocalWords:  aquota quotacheck limit grace period quotactl cmd caddr addr dqb
 % LocalWords:  QUOTAON ENODEV ENOPKG ENOTBLK GETQUOTA SETQUOTA SETUSE SETQLIM
 % LocalWords:  forced allowed sendmail SYSLOG WAKE ALARM CLOCK BOOTTIME dqstats
index acbedc27d3b7796663f76093366286280f7d25b3..dc5bdfa2d45b291a0e6ff3304af097350b9a5f30 100644 (file)
@@ -258,7 +258,7 @@ corrispondente,\footnote{è \func{open} che alloca \kstruct{file}, la inserisce
     supporta la funzionalità.
   \item[\errcode{EFBIG}] il file è troppo grande per essere aperto, in genere
     dovuto al fatto che si è compilata una applicazione a 32 bit senza
-    abilitare il supporto per le dimesioni a 64 bit; questo è il valore
+    abilitare il supporto per le dimensioni a 64 bit; questo è il valore
     restituito fino al kernel 2.6.23, coi successivi viene restituito
     \errcode{EOVERFLOW} come richiesto da POSIX.1.
   \item[\errcode{ELOOP}] si sono incontrati troppi collegamenti simbolici nel
@@ -451,6 +451,11 @@ sez.~\ref{sec:file_fcntl_ioctl}).
                             aggiunta in Linux a partire dal kernel
                             2.1.126, ed utilizzabile soltanto se si è definita
                             la macro \macro{\_GNU\_SOURCE}.\\
+      \const{O\_TMPFILE} & Consente di creare un file temporaneo anonimo, non
+                           visibile con un pathname sul filesystem, ma
+                           leggibile e scrivibile all'interno del processo.
+                           Introdotto con il kernel 3.11, è specifico di
+                           Linux.\\ 
       \constd{O\_TRUNC}  & Se usato su un file di dati aperto in scrittura,
                            ne tronca la lunghezza a zero; con un terminale o
                            una \textit{fifo} viene ignorato, negli altri casi
@@ -471,7 +476,7 @@ Si è riportato in tab.~\ref{tab:open_time_flag} l'elenco dei flag delle
 \textsl{modalità di apertura}.\footnote{la \acr{glibc} definisce anche i due
   flag \constd{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock}
   e \constd{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi
-  sez.~\ref{sec:file_locking}, si tratta di opzioni specifiche di BSD, che non
+  sez.~\ref{sec:file_locking}), si tratta di opzioni specifiche di BSD, che non
   esistono con Linux.}  Uno di questi, \const{O\_EXCL}, ha senso solo se usato
 in combinazione a \const{O\_CREAT} quando si vuole creare un nuovo file per
 assicurarsi che questo non esista di già, e lo si usa spesso per creare i
@@ -481,7 +486,7 @@ Si tenga presente che questa opzione è supportata su NFS solo a partire da
 NFSv3 e con il kernel 2.6, nelle versioni precedenti la funzionalità viene
 emulata controllando prima l'esistenza del file per cui usarla per creare un
 file di lock potrebbe dar luogo a una \textit{race condition}, in tal caso
-infatto un file potrebbe venir creato fra il controllo la successiva apertura
+infatti un file potrebbe venir creato fra il controllo la successiva apertura
 con \const{O\_CREAT}; la cosa si può risolvere comunque creando un file con un
 nome univoco ed usando la funzione \func{link} per creare il file di lock,
 (vedi sez.~\ref{sec:ipc_file_lock}).
@@ -505,6 +510,56 @@ tab.~\ref{tab:file_file_times} vengono impostati al tempo corrente. Se invece
 si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il
 \textit{modification time} e lo \textit{status change time}.
 
+Il flag \constd{O\_TMPFILE}, introdotto con il kernel
+3.11,\footnote{inizialmente solo su alcuni filesystem (i vari \acr{extN},
+  \acr{Minix}, \acr{UDF}, \acr{shmem}) poi progressivamente esteso ad altri
+  (\acr{XFS} con il 3.15, \acr{Btrfs} e \acr{F2FS} con il 3.16, \acr{ubifs}
+  con il 4.9).}  consente di aprire un file temporaneo senza che questo venga
+associato ad un nome e compaia nel filesystem. In questo caso la funzione
+restituirà un file descriptor da poter utilizzare per leggere e scrivere dati,
+ma il contenuto dell'argomento \param{path} verrà usato solamente per
+determinare, in base alla directory su cui si verrebbe a trovare il
+\textit{pathname} indicato, il filesystem all'interno del quale deve essere
+allocato l'\textit{inode} e lo spazio disco usato dal file
+descriptor. L'\textit{inode} resterà anonimo e l'unico riferimento esistente
+sarà quello contenuto nella \textit{file table} del processo che ha chiamato
+\func{open}.
+
+Lo scopo principale del flag è quello fornire una modalità atomica, semplice e
+sicura per applicare la tecnica della creazione di un file temporaneo seguita
+dalla sua immediata cancellazione con \func{unlink} per non lasciare rimasugli
+sul filesystem, di cui è parlato in sez.~\ref{sec:link_symlink_rename}.
+Inoltre, dato che il file non compare nel filesystem, si evitano alla radice
+tutti gli eventuali problemi di \textit{race condition} o \textit{symlink
+  attack} e non ci si deve neanche preoccupare di ottenere un opportuno nome
+univoco con l'uso delle funzioni di sez.~\ref{sec:file_temp_file}.
+
+Una volta aperto il file vi si potrà leggere o scrivere a seconda che siano
+utilizzati \const{O\_RDWR} o \const{O\_WRONLY}, mentre l'uso di
+\func{O\_RDONLY} non è consentito, non avendo molto senso ottenere un file
+descriptor da cui non si potrà comunque mai leggere nulla. L'unico altro flag
+che può essere utilizzato insieme a \const{O\_TMPFILE} è \const{O\_EXCL}, che
+in questo caso assume però un significato diverso da quello ordinario, dato
+che in questo caso non avrebbe senso fallire se il file non esiste, dato che
+questo è sempre vero.
+
+L'uso di \const{O\_EXCL} attiene all'altro possibile impiego di
+\const{O\_TMPFILE} oltre a quello della creazione sicura di un file temporaneo
+come sostituto di \func{tmpfile}: la possibilità di creare un eventuale
+contenuto iniziale ed impostare permessi, proprietario e attributi estesi con
+\func{fchmod}, \func{fchown} e \func{fsetxattr} operando sul file descriptor,
+senza possibilità di \textit{race condition} ed interferenze esterne, per poi
+far apparire il tutto sul filesystem in un secondo tempo utilizzando
+\func{linkat} sul file descriptor (torneremo su questo in
+sez.~\ref{sec:file_openat}) per dargli un nome. Questa operazione però non
+sarà possibile se si è usato \const{O\_EXCL}, che in questo caso viene ad
+assumere il significato di escludere la possibilità di far esistere il file
+anche in un secondo tempo.
+
+% NOTE: per O_TMPFILE vedi: http://kernelnewbies.org/Linux_3.11
+% https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/
+
+
 \begin{table}[!htb]
   \centering
   \footnotesize
@@ -542,7 +597,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il
                            l'impostazione della suddetta modalità con
                            \func{fcntl} (vedi
                            sez.~\ref{sec:file_fcntl_ioctl}).\\ 
-      \constd{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in
+      \const{O\_DIRECT}  & Esegue l'I/O direttamente dalla memoria in
                            \textit{user space} in maniera sincrona, in modo da
                            scavalcare i meccanismi di bufferizzazione del
                            kernel. Introdotto con il kernel 2.4.10 ed
@@ -592,11 +647,6 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il
                            dell'arrivo degli stessi e della parte di metadati
                            ad essi relativa sull'hardware sottostante (in
                            questo significato solo dal kernel 2.6.33).\\
-      \const{O\_TMPFILE} & Consente di creare un file temporaneo anonimo, non
-                           visibile con un pathname sul filesystem, ma
-                           leggibile e scrivibile all'iterno del processo.
-                           Introdotto con il kernel 3.11, è specifico di
-                           Linux.\\ 
       \hline
     \end{tabular}
     \caption{Le costanti che identificano le \textit{modalità di operazione} di
@@ -628,7 +678,7 @@ specifica di definirlo in fase di apertura del file, è sempre opportuno
 attivarlo in un secondo tempo con \func{fcntl} (vedi
 sez.~\ref{sec:file_fcntl_ioctl}).
 
-Il flag \const{O\_DIRECT} non è previsto da nessuno standard, anche se è
+Il flag \constd{O\_DIRECT} non è previsto da nessuno standard, anche se è
 presente in alcuni kernel unix-like.\footnote{il flag è stato introdotto dalla
   SGI in IRIX, ma è presente senza limiti di allineamento dei buffer anche in
   FreeBSD.} Per i kernel della serie 2.4 si deve garantire che i buffer in
@@ -656,7 +706,7 @@ completamente equivalente all'uso di \const{O\_SYNC} che garantisce anche
 sulla scrittura sincrona dei metadati associati alla scrittura dei dati del
 file.\footnote{la situazione si complica ulteriormente per NFS, in cui l'uso
   del flag disabilita la bufferizzazione solo dal lato del client, e può
-  causare problemi di prestazioni.} Per questo in genere è opportuno se si usa
+  causare problemi di prestazioni.} Per questo in genere se si usa
 \const{O\_DIRECT} è opportuno richiedere anche \const{O\_SYNC}.
 
 Si tenga presente infine che la implementazione di \const{O\_SYNC} di Linux
@@ -697,7 +747,6 @@ all'identificazione di una posizione sul filesystem (ad uso delle
 operazioni che riguardano il file descriptor in quanto tale, senza consentire
 operazioni sul file; in sostanza se si apre un file con \const{O\_PATH} si
 potrà soltanto:
-
 \begin{itemize*}
 \item usare il file descriptor come indicatore della directory di partenza con
   una delle \textit{at-functions} (vedi sez.~\ref{sec:file_openat});
@@ -714,24 +763,34 @@ potrà soltanto:
     flags} con \func{fcntl} (rispettivamente con le operazioni
   \const{F\_GETFL}, \const{F\_SETFD} e \const{F\_GETFD}, vedi
   sez.~\ref{sec:file_fcntl_ioctl}).
-\item chiudere il file con \func{close};
+\item chiudere il file con \func{close}.
 \end{itemize*}
 
-In realtà usando \const{O\_PATH} il file non viene effettivamente aperto per
+In realtà usando \const{O\_PATH} il file non viene effettivamente aperto, per
 cui ogni tentativo di usare il file descriptor così ottenuto con funzioni che
 operano effettivamente sul file (come ad esempio \func{read}, \func{write},
-\func{fchown}, \func{fchmod}, \func{ioctl}, ecc.) fallirano con un errore di
-\errval{EBADF}, come se questo non fosse un file descriptor valido.
+\func{fchown}, \func{fchmod}, \func{ioctl}, ecc.) fallirà con un errore di
+\errval{EBADF}, come se questo non fosse un file descriptor valido. Per questo
+motivo usando questo flag non è necessario avere nessun permesso per aprire un
+file, neanche quello di lettura (occorre ovviamente avere il permesso di
+esecuzione per le directory sovrastanti).
+
+Questo consente di usare il file descriptor con funzioni che non richiedono
+permessi sul file, come \func{fstat}, laddove un'apertura con
+\const{O\_RDONLY} sarebbe fallita. I permessi verranno eventualmente
+controllati, se necessario, nelle operazioni seguenti, ad esempio per usare
+\func{fchdir} con il file descriptor (se questo fa riferimento ad una
+directory) occorrerà avere il permesso di esecuzione.
 
 Se si usa \const{O\_PATH} tutti gli altri flag eccettuati \const{O\_CLOEXEC},
-\const{O\_DIRECTORY} e \const{O\_NOFOLLOW} verranno ignorati.
-
-% TODO: aggiungere O_TMPFILE per la creazione di file temporanei senza che
-% questi appaiano sul filesystem, introdotto con il 3.11, vedi:
-% https://lwn.net/Articles/556512/, http://kernelnewbies.org/Linux_3.11
-% https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/
-
-
+\const{O\_DIRECTORY} e \const{O\_NOFOLLOW} verranno ignorati. I primi due
+mantengono il loro significato usuale, mentre \const{O\_NOFOLLOW} fa si che se
+il file indicato è un un link simbolico venga aperto quest'ultimo (cambiando
+quindi il comportamento ordinario che prova il fallimento della chiamata),
+così da poter usare il file descriptor ottenuto per le funzioni
+\func{fchownat}, \func{fstatat}, \func{linkat} e \func{readlinkat} che ne
+supportano l'uso come come primo argomento (torneremo su questo in
+sez.~\ref{sec:file_openat}).
 
 
 Nelle prime versioni di Unix i valori di \param{flag} specificabili per
@@ -1774,7 +1833,12 @@ anche l'aggiunta di un ulteriore argomento finale, \param{flags}.
 
 % TODO manca prototipo di linkat, verificare se metterlo o metter menzione
 % altre modifiche al riguardo nel 3.11 (AT_EMPTY_PATH?) vedi
-% http://lwn.net/Articles/562488/ 
+% http://lwn.net/Articles/562488/
+
+% TODO: Trattare esempio di inzializzazione di file e successivo collegamento
+% con l'uso di O_TMPFILE e linkat, vedi man open
+
+
 % TODO manca prototipo di utimensat, verificare se metterlo o metter menzione
 % TODO manca prototipo di renameat2, introdotta nel 3.15, vedi
 % http://lwn.net/Articles/569134/ 
@@ -4406,5 +4470,8 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
-%  LocalWords:  l'I nell' du vm Documentation Urlich Drepper futimesat times
-%  LocalWords:  futimens fs Tread all'I ll
+
+% LocalWords:  nell' du vm Documentation Urlich Drepper futimesat times
+%  LocalWords:  futimens fs Tread all'I ll TMPFILE EDQUOT extN Minix UDF XFS
+%  LocalWords:  shmem Btrfs ubifs tmpfile fchmod fchown fsetxattr fchdir PF
+%  LocalWords:  fstatfs sull'