X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;fp=filestd.tex;h=15da6a791ca905e6b3849abb42896600675fdda7;hp=b2a3c18d754a6119f182f48c0c5714538dd2c652;hb=ff76d56c6a2c280cbe4f153173488871d7b12336;hpb=6e257bf71f9acd5839dbae72de3dc9523cfb47c9 diff --git a/filestd.tex b/filestd.tex index b2a3c18..15da6a7 100644 --- a/filestd.tex +++ b/filestd.tex @@ -1,6 +1,6 @@ %% filestd.tex %% -%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2007 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -8,6 +8,7 @@ %% license is included in the section entitled "GNU Free Documentation %% License". %% + \chapter{I file: l'interfaccia standard ANSI C} \label{cha:files_std_interface} @@ -37,6 +38,7 @@ costituire il nucleo\footnote{queste funzioni sono state implementate la prima \label{sec:file_stream} \index{file!stream|(} + Come più volte ribadito, l'interfaccia dei file descriptor è un'interfaccia di basso livello, che non provvede nessuna forma di formattazione dei dati e nessuna forma di bufferizzazione per ottimizzare le operazioni di I/O. @@ -69,6 +71,7 @@ formattazioni), i file stream restano del tutto equivalenti ai file descriptor (sui quali sono basati), ed in particolare continua a valere quanto visto in sez.~\ref{sec:file_sharing} a proposito dell'accesso condiviso ed in sez.~\ref{sec:file_access_control} per il controllo di accesso. + \index{file!stream|)} @@ -83,7 +86,7 @@ stream, come la posizione corrente, lo stato del buffer e degli indicatori di stato e di fine del file. Per questo motivo gli utenti non devono mai utilizzare direttamente o allocare -queste strutture (che sono dei \textsl{tipi opachi}\index{tipo!opaco}) ma +queste strutture (che sono dei \index{tipo!opaco} \textsl{tipi opachi}) ma usare sempre puntatori del tipo \texttt{FILE *} ottenuti dalla libreria stessa (tanto che in certi casi il termine di puntatore a file è diventato sinonimo di stream). Tutte le funzioni della libreria che operano sui file accettano @@ -748,10 +751,11 @@ dentro la stringa. Se la lettura incontra la fine del file (o c' viene restituito un \val{NULL}, ed il buffer \param{buf} non viene toccato. L'uso di \func{gets} è deprecato e deve essere assolutamente evitato; la funzione infatti non controlla il numero di byte letti, per cui nel caso la -stringa letta superi le dimensioni del buffer, si avrà un \textit{buffer - overflow}\itindex{buffer~overflow}, con sovrascrittura della memoria del -processo adiacente al buffer.\footnote{questa tecnica è spiegata in dettaglio - e con molta efficacia nell'ormai famoso articolo di Aleph1 \cite{StS}.} +stringa letta superi le dimensioni del buffer, si avrà un +\itindex{buffer~overflow} \textit{buffer overflow}, con sovrascrittura della +memoria del processo adiacente al buffer.\footnote{questa tecnica è spiegata + in dettaglio e con molta efficacia nell'ormai famoso articolo di Aleph1 + \cite{StS}.} Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non autorizzati al sistema (i cosiddetti \textit{exploit}), basta infatti inviare @@ -867,7 +871,7 @@ Se il buffer di destinazione subito, altrimenti il buffer viene allargato usando \func{realloc} e la nuova dimensione ed il nuovo puntatore vengono restituiti indietro (si noti infatti come per entrambi gli argomenti si siano usati dei -\itindex{value~result~argument}\textit{value result argument}, passando dei +\itindex{value~result~argument} \textit{value result argument}, passando dei puntatori anziché i valori delle variabili, secondo la tecnica spiegata in sez.~\ref{sec:proc_var_passing}). @@ -877,7 +881,7 @@ necessaria a contenere la linea. In tutti i casi si ottiene dalla funzione un puntatore all'inizio del testo della linea letta. Un esempio di codice può essere il seguente: \includecodesnip{listati/getline.c} -e per evitare \textit{memory leak}\itindex{memory~leak} occorre ricordarsi di +e per evitare \itindex{memory~leak} \textit{memory leak} occorre ricordarsi di liberare \var{ptr} con una \func{free}. Il valore di ritorno della funzione indica il numero di caratteri letti @@ -932,8 +936,9 @@ quello specificato) la terza permette di stampare su una stringa, in genere l'uso di \func{sprintf} è sconsigliato in quanto è possibile, se non si ha la sicurezza assoluta sulle dimensioni del risultato della stampa, eccedere le dimensioni di \param{str}, con conseguente sovrascrittura di altre variabili e -possibili \textit{buffer overflow}\itindex{buffer~overflow}; per questo motivo -si consiglia l'uso dell'alternativa \funcd{snprintf}, il cui prototipo è: +possibili \itindex{buffer~overflow} \textit{buffer overflow}; per questo +motivo si consiglia l'uso dell'alternativa \funcd{snprintf}, il cui prototipo +è: \begin{prototype}{stdio.h} {snprintf(char *str, size\_t size, const char *format, ...)} Identica a \func{sprintf}, ma non scrive su \param{str} più di @@ -943,7 +948,7 @@ si consiglia l'uso dell'alternativa \funcd{snprintf}, il cui prototipo La parte più complessa delle funzioni di scrittura formattata è il formato della stringa \param{format} che indica le conversioni da fare, e da cui deriva anche il numero degli argomenti che dovranno essere passati a seguire -(si noti come tutte queste funzioni siano \textit{variadic}\index{variadic}, +(si noti come tutte queste funzioni siano \index{variadic} \textit{variadic}, prendendo un numero di argomenti variabile che dipende appunto da quello che si è specificato in \param{format}). @@ -1117,8 +1122,8 @@ scritti sulla stringa di destinazione: Identica a \func{vsprintf}, ma non scrive su \param{str} più di \param{size} caratteri. \end{prototype} -\noindent in modo da evitare possibili buffer -overflow\itindex{buffer~overflow}. +\noindent in modo da evitare possibili \itindex{buffer~overflow} buffer +overflow. Per eliminare alla radice questi problemi, le \acr{glibc} supportano una @@ -1144,11 +1149,11 @@ sono: Entrambe le funzioni prendono come argomento \param{strptr} che deve essere l'indirizzo di un puntatore ad una stringa di caratteri, in cui verrà restituito (si ricordi quanto detto in sez.~\ref{sec:proc_var_passing} a -proposito dei \itindex{value~result~argument}\textit{value result argument}) +proposito dei \itindex{value~result~argument} \textit{value result argument}) l'indirizzo della stringa allocata automaticamente dalle funzioni. Occorre inoltre ricordarsi di invocare \func{free} per liberare detto puntatore quando -la stringa non serve più, onde evitare \textit{memory - leak}\itindex{memory~leak}. +la stringa non serve più, onde evitare \itindex{memory~leak} \textit{memory + leak}. Infine una ulteriore estensione GNU definisce le due funzioni \func{dprintf} e \func{vdprintf}, che prendono un file descriptor al posto dello stream. Altre @@ -1230,9 +1235,9 @@ all'interno di un file per effettuare operazioni di lettura o scrittura in un punto prestabilito; sempre che l'operazione di riposizionamento sia supportata dal file sottostante lo stream, quando cioè si ha a che fare con quello che viene detto un file ad \textsl{accesso casuale}.\footnote{dato che in un - sistema Unix esistono vari tipi di file, come le fifo ed i file di - dispositivo\index{file!di~dispositivo}, non è scontato che questo sia sempre - vero.} + sistema Unix esistono vari tipi di file, come le fifo ed i + \index{file!di~dispositivo} file di dispositivo, non è scontato che questo + sia sempre vero.} In GNU/Linux ed in generale in ogni sistema unix-like la posizione nel file è espressa da un intero positivo, rappresentato dal tipo \type{off\_t}, il