X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filestd.tex;h=ba27efab1c721dece86975c39ddaf8bb8c84c2d6;hb=34c8ae732b8ffe5f4a87cdd0eba3a02df4c76d55;hp=aeeb9a02770ec4792f5ff805d0f4746ed3b9e3df;hpb=bf81ce9ec539254693a8c41641a99af1aa1d886f;p=gapil.git diff --git a/filestd.tex b/filestd.tex index aeeb9a0..ba27efa 100644 --- a/filestd.tex +++ b/filestd.tex @@ -746,10 +746,9 @@ 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}\index{\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}.} + 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}.} Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non autorizzati al sistema (i cosiddetti \textit{exploit}), basta @@ -864,10 +863,10 @@ contenente le dimensioni del buffer suddetto. Se il buffer di destinazione è sufficientemente ampio la stringa viene scritta subito, altrimenti il buffer viene allargato usando \func{realloc} e la nuova -dimensione ed il nuovo puntatore vengono passata indietro (si noti infatti +dimensione ed il nuovo puntatore vengono restituiti indietro (si noti infatti come per entrambi gli argomenti si siano usati dei -\index{\textit{value~result~argument}}\textit{value result argument}, passando -dei puntatori anziché i valori delle variabili, secondo la tecnica spiegata in +\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}). Se si passa alla funzione l'indirizzo di un puntatore impostato a \val{NULL} e @@ -876,7 +875,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 memory leak\index{\textit{memory~leak}} occorre ricordarsi di +e per evitare \textit{memory leak}\itindex{memory~leak} occorre ricordarsi di liberare \var{ptr} con una \func{free}. Il valore di ritorno della funzione indica il numero di caratteri letti @@ -931,9 +930,8 @@ 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}\index{\textit{buffer~overflow}}; per questo -motivo si consiglia l'uso dell'alternativa \funcd{snprintf}, il cui prototipo -è: +possibili \textit{buffer overflow}\itindex{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 @@ -1118,7 +1116,7 @@ scritti sulla stringa di destinazione: \param{size} caratteri. \end{prototype} \noindent in modo da evitare possibili buffer -overflow\index{\textit{buffer~overflow}}. +overflow\itindex{buffer~overflow}. Per eliminare alla radice questi problemi, le \acr{glibc} supportano una @@ -1140,14 +1138,15 @@ sono: \bodydesc{Le funzioni ritornano il numero di caratteri stampati.} \end{functions} + 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 \index{\textit{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 memory -leak\index{\textit{memory~leak}}. +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}. Infine una ulteriore estensione GNU definisce le due funzioni \func{dprintf} e \func{vdprintf}, che prendono un file descriptor al posto dello stream. Altre @@ -1192,7 +1191,7 @@ questo argomento sono varie differenze. Le funzioni di input infatti sono più orientate verso la lettura di testo libero che verso un input formattato in campi fissi. Uno spazio in \param{format} corrisponde con un numero qualunque di caratteri di -separazione (che possono essere spazi, tabulatori, virgole etc.), mentre +separazione (che possono essere spazi, tabulatori, virgole ecc.), mentre caratteri diversi richiedono una corrispondenza esatta. Le direttive di conversione sono analoghe a quelle di \func{printf} e si trovano descritte in dettaglio nelle pagine di manuale e nel manuale delle \acr{glibc}.