From 4a64ffb309155737e851268a29e4217987a9c15e Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 10 Sep 2011 19:01:15 +0000 Subject: [PATCH] Correzioni varie e ampliamenti sulla gestione delle capabilities. --- fileadv.tex | 4 +- filedir.tex | 323 ++++++++++++++++++++++++------------ listati/cap_user_header_t.h | 17 +- othersock.tex | 6 +- process.tex | 2 +- prochand.tex | 155 +++++++++++------ sockctrl.tex | 22 +-- system.tex | 7 +- 8 files changed, 357 insertions(+), 179 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 3fa17dc..e69c9d7 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1625,7 +1625,7 @@ indicare quale tipo di evento relativo ad \param{fd} si vuole che sia tenuto sotto controllo. L'argomento viene ignorato con l'operazione \const{EPOLL\_CTL\_DEL}.\footnote{fino al kernel 2.6.9 era comunque richiesto che questo fosse un puntatore valido, anche se poi veniva ignorato; a - partire dal 2.6.9 si può specificare anche un valore \texttt{NULL} ma se si + partire dal 2.6.9 si può specificare anche un valore \val{NULL} ma se si vuole mantenere la compatibilità con le versioni precedenti occorre usare un puntatore valido.} @@ -4741,7 +4741,7 @@ definito la macro \macro{\_GNU\_SOURCE},\footnote{si ricordi che questa \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'operazione richiesta. \item[\errcode{ESPIPE}] o \param{off\_in} o \param{off\_out} non sono - \const{NULL} ma il corrispondente file descriptor è una \textit{pipe}. + \val{NULL} ma il corrispondente file descriptor è una \textit{pipe}. \end{errlist} } \end{functions} diff --git a/filedir.tex b/filedir.tex index 8e93228..461bcac 100644 --- a/filedir.tex +++ b/filedir.tex @@ -2162,7 +2162,7 @@ definizione è riportata in fig.~\ref{fig:sys_timespec_struct}. Come per le precedenti funzioni il primo elemento di \param{times} indica il tempo di ultimo accesso ed il secondo quello di ultima modifica, e se si usa -il valore \const{NULL} verrà impostato il tempo corrente sia per l'ultimo +il valore \val{NULL} verrà impostato il tempo corrente sia per l'ultimo accesso che per l'ultima modifica. Nei singoli elementi di \param{times} si possono inoltre utilizzare due valori speciali per il campo \var{tv\_nsec}: con \const{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con @@ -3605,7 +3605,7 @@ queste funzioni che prendiamo in esame è \funcd{acl\_init}, il cui prototipo Inizializza un'area di lavoro per una ACL di \param{count} voci. \bodydesc{La funzione restituisce un puntatore all'area di lavoro in caso di - successo e \const{NULL} in caso di errore, nel qual caso \var{errno} + successo e \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EINVAL}] il valore di \param{count} è negativo. @@ -3878,7 +3878,7 @@ rappresentazione testuale della ACL, il suo prototipo è: Produce la rappresentazione testuale di una ACL. \bodydesc{La funzione restituisce il puntatore ad una stringa con la - rappresentazione testuale della ACL in caso di successo e \code{NULL} in + rappresentazione testuale della ACL in caso di successo e \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati. @@ -4618,7 +4618,7 @@ Con questo supporto e con le ulteriori modifiche introdotte con il kernel 2.6.25 il meccanismo delle \textit{capabilities} è stato totalmente rivoluzionato, rendendolo più aderente alle intenzioni originali dello standard POSIX, rimuovendo il significato che fino ad allora aveva avuto la -capacità \macro{CAP\_SETPCAP} e cambiando le modalità di funzionamento del +capacità \const{CAP\_SETPCAP} e cambiando le modalità di funzionamento del cosiddetto \itindex{capabilities~bounding~set} \textit{capabilities bounding set}. Ulteriori modifiche sono state apportate con il kernel 2.6.26 per consentire la rimozione non ripristinabile dei privilegi di @@ -4674,7 +4674,7 @@ altri tre insiemi associabili a ciascun file.\footnote{la realizzazione viene eseguita con l'uso di uno specifico attributo esteso, \texttt{security.capability}, la cui modifica è riservata, (come illustrato in sez.~\ref{sec:file_xattr}) ai processi dotato della capacità - \macro{CAP\_SYS\_ADMIN}.} Le \textit{file capabilities} hanno effetto + \const{CAP\_SYS\_ADMIN}.} Le \textit{file capabilities} hanno effetto soltanto quando il file che le porta viene eseguito come programma con una \func{exec}, e forniscono un meccanismo che consente l'esecuzione dello stesso con maggiori privilegi; in sostanza sono una sorta di estensione del @@ -5097,8 +5097,8 @@ che è opportuno dettagliare maggiormente. introdotta dal kernel 2.6.38 come capacità separata da \const{CAP\_SYS\_ADMIN}.\\ \const{CAP\_WAKE\_ALARM}& La capacità di usare i timer di tipo - \macro{CLOCK\_BOOTTIME\_ALARM} e - \macro{CLOCK\_REALTIME\_ALARM}, vedi + \const{CLOCK\_BOOTTIME\_ALARM} e + \const{CLOCK\_REALTIME\_ALARM}, vedi sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\ \hline \end{tabular} @@ -5161,17 +5161,20 @@ Una terza \textit{capability} con vasto campo di applicazione è \const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative, come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e disattivare la swap, montare, rimontare e smontare filesystem (vedi -sez.~\ref{sec:sys_file_config}), effettuare operazioni di controllo sugli -oggetti dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare sugli -attributi estesi di classe \texttt{security} o \texttt{trusted} (vedi -sez.~\ref{sec:file_xattr}), specificare un user-ID arbitrario nella -trasmissione delle credenziali dei socket (vedi sez.~\ref{sec:socket_xxx}), -assegnare classi privilegiate per lo scheduling dell'I/O (vedi +sez.~\ref{sec:sys_file_config}), effettuare operazioni di controllo su +qualunque oggetto dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare +sugli attributi estesi dei file di classe \texttt{security} o \texttt{trusted} +(vedi sez.~\ref{sec:file_xattr}), specificare un \textit{user-ID} arbitrario +nella trasmissione delle credenziali dei socket (vedi +sez.~\ref{sec:socket_credential_xxx}), assegnare classi privilegiate +(\const{IOPRIO\_CLASS\_RT} e prima del kernel 2.6.25 anche +\const{IOPRIO\_CLASS\_IDLE}) per lo scheduling dell'I/O (vedi sez.~\ref{sec:io_priority}), superare il limite di sistema sul numero massimo di file aperti,\footnote{quello indicato da \procfile{/proc/sys/fs/file-max}.} effettuare operazioni privilegiate sulle chiavi mantenute dal kernel (vedi -sez.~\ref{sec:io_priority}), usare la funzione \func{lookup\_dcookie}, usare -\const{CLONE\_NEWNS} con \func{unshare}, (vedi sez.~\ref{sec:process_clone}). +sez.~\ref{sec:keyctl_management}), usare la funzione \func{lookup\_dcookie}, +usare \const{CLONE\_NEWNS} con \func{unshare}, (vedi +sez.~\ref{sec:process_clone}). Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di aumentare le priorità di esecuzione dei processi, come la diminuzione del @@ -5189,13 +5192,10 @@ possibilità di superare i limiti imposti sulle risorse di sistema, come usare lo spazio disco riservato all'amministratore sui filesystem che lo supportano, usare la funzione \func{ioctl} per controllare il \textit{journaling} sul filesystem \acr{ext3}, non subire le quote disco, aumentare i limiti sulle -risorse (vedi sez.~\ref{sec:sys_resource_limit}) e sulle dimensioni dei -messaggi delle code del SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}). +risorse di un processo (vedi sez.~\ref{sec:sys_resource_limit}) e quelle sul +numero di processi, ed i limiti sulle dimensioni dei messaggi delle code del +SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}). -Questo modo di intendere ... da fare ... per cui -a partire dal 2.6.24/5 è divenuta quella di impostare una capacità del -\textit{bounding set} nelle proprie \textit{inheritable} o rimuoverla dal -\textit{bounding set} stesso. Per la gestione delle \textit{capabilities} il kernel mette a disposizione due funzioni che permettono rispettivamente di leggere ed impostare i valori dei @@ -5231,21 +5231,22 @@ loro rispettivi prototipi sono: Queste due funzioni prendono come argomenti due tipi di dati dedicati, definiti come puntatori a due strutture specifiche di Linux, illustrate in -fig.~\ref{fig:cap_kernel_struct}. Per poterle utilizzare occorre anche -cancellare la macro \macro{\_POSIX\_SOURCE}.\footnote{per farlo occorre - utilizzare la direttiva di preprocessore \direct{undef}; si dovrà cioè - inserire una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere - \texttt{sys/capability.h}.} Si tenga presente che le strutture di -fig.~\ref{fig:cap_kernel_struct}, come i prototipi delle due funzioni -\func{capget} e \func{capset}, sono soggette ad essere modificate con il -cambiamento del kernel (in particolare i tipi di dati delle strutture) ed -anche se finora l'interfaccia è risultata stabile, non c'è nessuna -assicurazione che questa venga mantenuta.\footnote{anzi, visto lo scarso - utilizzo di questa funzionalità ci sono state varie discussioni fra gli - sviluppatori del kernel relative all'eliminarla o al modificarla - radicalmente.} Pertanto se si vogliono scrivere programmi portabili che -possano essere eseguiti su qualunque versione del kernel è opportuno -utilizzare le interfacce di alto livello. +fig.~\ref{fig:cap_kernel_struct}. Per un certo periodo di tempo era anche +indicato che per poterle utilizzare fosse necessario che la macro +\macro{\_POSIX\_SOURCE} risultasse non definita (ed era richiesto di inserire +una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere +\texttt{sys/capability.h}) requisito che non risulta più presente.\footnote{e + non è chiaro neanche quanto sia mai stato davvero necessario.} + +Si tenga presente che le strutture di fig.~\ref{fig:cap_kernel_struct}, come i +prototipi delle due funzioni \func{capget} e \func{capset}, sono soggette ad +essere modificate con il cambiamento del kernel (in particolare i tipi di dati +delle strutture) ed anche se finora l'interfaccia è risultata stabile, non c'è +nessuna assicurazione che questa venga mantenuta,\footnote{viene però + garantito che le vecchie funzioni continuino a funzionare.} Pertanto se si +vogliono scrivere programmi portabili che possano essere eseguiti senza +modifiche o adeguamenti su qualunque versione del kernel è opportuno +utilizzare le interfacce di alto livello che vedremo più avanti. \begin{figure}[!htb] \footnotesize @@ -5261,15 +5262,26 @@ utilizzare le interfacce di alto livello. \end{figure} La struttura a cui deve puntare l'argomento \param{hdrp} serve ad indicare, -tramite il campo \var{pid}, il processo del quale si vogliono leggere o -modificare le \textit{capabilities}. Il campo \var{version} deve essere -impostato al valore della versione delle usata dal kernel (quello indicato -dalla costante \const{\_LINUX\_CAPABILITY\_VERSION} di +tramite il campo \var{pid}, il PID del processo del quale si vogliono leggere +o modificare le \textit{capabilities}. Con \func{capset} questo, se si usano +le \textit{file capabilities}, può essere solo 0 o PID del processo chiamante, +che sono equivalenti. Il campo \var{version} deve essere impostato al valore +della versione delle stesse usata dal kernel (quello indicato da una delle +costanti \texttt{\_LINUX\_CAPABILITY\_VERSION\_n} di fig.~\ref{fig:cap_kernel_struct}) altrimenti le funzioni ritorneranno con un errore di \errcode{EINVAL}, restituendo nel campo stesso il valore corretto -della versione in uso. La struttura a cui deve puntare l'argomento -\param{datap} invece conterrà i valori letti o da impostare per i tre insiemi -delle capacità del processo. +della versione in uso. La versione due è comunque deprecata e non deve essere +usata (il kernel stamperà un avviso). I valori delle \textit{capabilities} +devono essere passati come maschere binarie;\footnote{e si tenga presente che + i valori di tab.~\ref{tab:proc_capabilities} non possono essere combinati + direttamente, indicando il numero progressivo del bit associato alla + relativa capacità.} con l'introduzione delle \textit{capabilities} a 64 bit +inoltre il puntatore \param{datap} non può essere più considerato come +relativo ad una singola struttura, ma ad un vettore di due +strutture.\footnote{è questo cambio di significato che ha portato a deprecare + la versione 2, che con \func{capget} poteva portare ad un buffer overflow + per vecchie applicazioni che continuavano a considerare \param{datap} come + puntatore ad una singola struttura.} Dato che le precedenti funzioni, oltre ad essere specifiche di Linux, non garantiscono la stabilità nell'interfaccia, è sempre opportuno effettuare la @@ -5303,14 +5315,14 @@ relativi dati. La funzione è \funcd{cap\_init} ed il suo prototipo è: Crea ed inizializza un \textit{capability state}. \bodydesc{La funzione ritorna un valore non nullo in caso di successo e - \macro{NULL} in caso di errore, nel qual caso \var{errno} assumerà il + \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà il valore \errval{ENOMEM}. } \end{functions} La funzione restituisce il puntatore \type{cap\_t} ad uno stato inizializzato con tutte le \textit{capabilities} azzerate. In caso di errore (cioè quando -non c'è memoria sufficiente ad allocare i dati) viene restituito \macro{NULL} +non c'è memoria sufficiente ad allocare i dati) viene restituito \val{NULL} ed \var{errno} viene impostata a \errval{ENOMEM}. La memoria necessaria a mantenere i dati viene automaticamente allocata da \func{cap\_init}, ma dovrà essere disallocata esplicitamente quando non è più necessaria utilizzando, per @@ -5332,10 +5344,10 @@ della libreria sia per un \textit{capability state}, nel qual caso l'argomento dovrà essere un dato di tipo \type{cap\_t}, che per una descrizione testuale dello stesso,\footnote{cioè quanto ottenuto tramite la funzione \func{cap\_to\_text}.} nel qual caso l'argomento dovrà essere un dato di -tipo \texttt{char *}. Per questo l'argomento \param{obj\_d} è dichiarato come -\texttt{void *} e deve sempre corrispondere ad un puntatore ottenuto tramite -le altre funzioni della libreria, altrimenti la funzione fallirà con un errore -di \errval{EINVAL}. +tipo \texttt{char *}. Per questo motivo l'argomento \param{obj\_d} è +dichiarato come \texttt{void *} e deve sempre corrispondere ad un puntatore +ottenuto tramite le altre funzioni della libreria, altrimenti la funzione +fallirà con un errore di \errval{EINVAL}. Infine si può creare una copia di un \textit{capability state} ottenuto in precedenza tramite la funzione \funcd{cap\_dup}, il cui prototipo è: @@ -5346,7 +5358,7 @@ precedenza tramite la funzione \funcd{cap\_dup}, il cui prototipo è: Duplica un \textit{capability state} restituendone una copia. \bodydesc{La funzione ritorna un valore non nullo in caso di successo e - \macro{NULL} in caso di errore, nel qual caso \var{errno} potrà assumere i + \val{NULL} in caso di errore, nel qual caso \var{errno} potrà assumere i valori \errval{ENOMEM} o \errval{EINVAL}. } \end{functions} @@ -5380,11 +5392,81 @@ La funzione si limita ad azzerare tutte le \textit{capabilities} presenti nel restituendo uno stato \textsl{vuoto}, analogo a quello che si ottiene nella creazione con \func{cap\_init}. -Per la gestione dei valori delle \textit{capabilities} presenti in un -\textit{capability state} l'interfaccia prevede due funzioni, +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|l|} + \hline + \textbf{Valore} & \textbf{Significato} \\ + \hline + \hline + \const{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\ + \const{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\ + \const{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\ + \hline + \end{tabular} + \caption{Valori possibili per il tipo di dato \type{cap\_flag\_t} che + identifica gli insiemi delle \textit{capabilities}.} + \label{tab:cap_set_identifier} +\end{table} + +Una variante di \func{cap\_clear} è \funcd{cap\_clear\_flag} che cancella da +un \textit{capability state} tutte le \textit{capabilities} di un certo +insieme fra quelli di pag.~\pageref{sec:capabilities_set}, il suo prototipo +è: +\begin{functions} + \headdecl{sys/capability.h} + + \funcdecl{int cap\_clear\_flag(cap\_t cap\_p, cap\_flag\_t flag)} + + Cancella dal \textit{capability state} \param{cap\_p} tutte le + \textit{capabilities} dell'insieme \param{flag}. + + \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di + errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}. } +\end{functions} + +La funzione richiede che si indichi quale degli insiemi si intente cancellare +con l'argomento \param{flag}. Questo deve essere specificato con una variabile +di tipo \type{cap\_flag\_t} che può assumere esclusivamente\footnote{si tratta + in effetti di un tipo enumerato, come si può verificare dalla sua + definizione che si trova in \texttt{/usr/include/sys/capability.h}.} uno dei +valori illustrati in tab.~\ref{tab:cap_set_identifier}. + +Si possono inoltre confrontare in maniera diretta due \textit{capability + state} con la funzione \funcd{cap\_compare}; il suo prototipo è: +\begin{functions} + \headdecl{sys/capability.h} + \funcdecl{int cap\_compare(cap\_t cap\_a, cap\_t cap\_b)} + + Confronta due \textit{capability state}. + + \bodydesc{La funzione ritorna 0 se i \textit{capability state} sono identici + ed un valore positivo se differiscono, non sono previsti errori.} +\end{functions} + +La funzione esegue un confronto fra i due \textit{capability state} passati +come argomenti e ritorna in un valore intero il risultato, questo è nullo se +sono identici o positivo se vi sono delle differenze. Il valore di ritorno +della funzione consente inoltre di per ottenere ulteriori informazioni su +quali sono gli insiemi di \textit{capabilities} che risultano differenti. Per +questo si può infatti usare la apposita macro \macro{CAP\_DIFFERS}: +\begin{functions} + \funcdecl{int CAP\_DIFFERS(value, flag)} Controlla lo stato di eventuali + differenze delle \textit{capabilities} nell'insieme \texttt{flag}. +\end{functions} + +La macro che richiede si passi nell'argomento \texttt{value} il risultato +della funzione \func{cap\_compare} e in \texttt{flag} l'indicazione (coi +valori di tab.~\ref{tab:cap_set_identifier}) dell'insieme che si intende +controllare; restituirà un valore diverso da zero se le differenze rilevate da +\func{cap\_compare} sono presenti nell'insieme indicato. + +Per la gestione dei singoli valori delle \textit{capabilities} presenti in un +\textit{capability state} l'interfaccia prevede due funzioni specifiche, \funcd{cap\_get\_flag} e \funcd{cap\_set\_flag}, che permettono -rispettivamente di leggere o impostare il valore di un flag delle -\textit{capabilities}; i rispettivi prototipi sono: +rispettivamente di leggere o impostare il valore di una capacità all'interno +in uno dei tre insiemi già citati; i rispettivi prototipi sono: \begin{functions} \headdecl{sys/capability.h} @@ -5403,41 +5485,18 @@ rispettivamente di leggere o impostare il valore di un flag delle In entrambe le funzioni l'argomento \param{cap\_p} indica il puntatore al \textit{capability state} su cui operare, mentre l'argomento \param{flag} -indica su quale dei tre insiemi illustrati a -pag.~\pageref{sec:capabilities_set} si intende operare. Questi devono essere -specificati con una variabile di tipo \type{cap\_flag\_t} che può assumere -esclusivamente\footnote{si tratta in effetti di un tipo enumerato, come si può - verificare dalla sua definizione che si trova in - \texttt{/usr/include/sys/capability.h}.} uno dei valori illustrati in +indica su quale dei tre insiemi si intende operare, sempre con i valori di tab.~\ref{tab:cap_set_identifier}. -\begin{table}[htb] - \centering - \footnotesize - \begin{tabular}[c]{|l|l|} - \hline - \textbf{Valore} & \textbf{Significato} \\ - \hline - \hline - \const{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\ - \const{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\ - \const{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\ - \hline - \end{tabular} - \caption{Valori possibili per il tipo di dato \type{cap\_flag\_t} che - identifica gli insiemi delle \textit{capabilities}.} - \label{tab:cap_set_identifier} -\end{table} - La capacità che si intende controllare o impostare invece deve essere specificata attraverso una variabile di tipo \type{cap\_value\_t}, che può prendere come valore uno qualunque di quelli riportati in tab.~\ref{tab:proc_capabilities}, in questo caso però non è possibile combinare diversi valori in una maschera binaria, una variabile di tipo -\type{cap\_value\_t} deve indicare una sola capacità.\footnote{nel file di - header citato nella nota precedente il tipo \type{cap\_value\_t} è definito - come \ctyp{int}, ma i valori validi sono soltanto quelli di - tab.~\ref{tab:proc_capabilities}.} +\type{cap\_value\_t} può indicare una sola capacità.\footnote{in + \texttt{sys/capability.h} il tipo \type{cap\_value\_t} è definito come + \ctyp{int}, ma i valori validi sono soltanto quelli di + tab.~\ref{tab:proc_capabilities}.} Infine lo stato di una capacità è descritto ad una variabile di tipo \type{cap\_flag\_value\_t}, che a sua volta può assumere soltanto @@ -5463,19 +5522,26 @@ tab.~\ref{tab:cap_value_type}. La funzione \func{cap\_get\_flag} legge lo stato della capacità indicata dall'argomento \param{cap} all'interno dell'insieme indicato dall'argomento -\param{flag} e ne restituisce il valore nella variabile posta all'indirizzo -puntato dall'argomento \param{value\_p}; è possibile cioè leggere soltanto uno -stato di una capacità alla volta. +\param{flag} lo restituisce nella variabile puntata +dall'argomento \param{value\_p}. Questa deve essere di tipo +\type{cap\_flag\_value\_t} ed assumerà uno dei valori di +tab.~\ref{tab:cap_value_type}. La funzione consente pertanto di leggere solo +lo stato di una capacità alla volta. La funzione \func{cap\_set\_flag} può invece impostare in una sola chiamata -più \textit{capabilities}, anche se solo all'interno dello stesso insieme. Per -questo motivo essa prende un vettore di valori di tipo \type{cap\_value\_t} -nell'argomento \param{caps}, la cui dimensione viene specificata dall'argomento -\param{ncap}. Il tipo di impostazione da eseguire (cancellazione o -impostazione) viene indicato dall'argomento \param{value}. - -Per la visualizzazione dello stato delle \textit{capabilities} l'interfaccia -prevede una funzione apposita, \funcd{cap\_to\_text}, il cui prototipo è: +più \textit{capabilities}, anche se solo all'interno dello stesso insieme ed +allo stesso valore. Per questo motivo essa prende un vettore di valori di tipo +\type{cap\_value\_t} nell'argomento \param{caps}, la cui dimensione viene +specificata dall'argomento \param{ncap}. Il tipo di impostazione da eseguire +(cancellazione o impostazione) per le capacità elencate in \param{caps} viene +indicato dall'argomento \param{value} sempre con i valori di +tab.~\ref{tab:cap_value_type}. + +Per semplificare la gestione delle \textit{capabilities} l'interfaccia prevede +che sia possibile utilizzare anche una rappresentazione testuale del contenuto +di un \textit{capability state} e fornisce le opportune funzioni di gestione; +la prima di queste, che consente di ottenere la rappresentazione testuale, è +\funcd{cap\_to\_text}, il cui prototipo è: \begin{functions} \headdecl{sys/capability.h} @@ -5491,17 +5557,64 @@ prevede una funzione apposita, \funcd{cap\_to\_text}, il cui prototipo è: \end{functions} La funzione ritorna l'indirizzo di una stringa contente la descrizione -testuale del contenuto del \textit{capabilities state} \param{caps} passato -come argomento, e, qualora l'argomento \param{length\_p} sia diverso da -\val{NULL}, restituisce nella variabile intera da questo puntata la lunghezza -della stringa. La stringa restituita viene allocata automaticamente dalla -funzione e pertanto dovrà essere liberata con \func{cap\_free}. +testuale del contenuto del \textit{capability state} \param{caps} passato come +argomento, e, qualora l'argomento \param{length\_p} sia diverso da \val{NULL}, +restituisce nella variabile intera da questo puntata la lunghezza della +stringa. La stringa restituita viene allocata automaticamente dalla funzione e +pertanto dovrà essere liberata con \func{cap\_free}. + +La rappresentazione testuale, che viene usata anche di programmi di gestione a +riga di comando, prevede che lo stato venga rappresentato con una stringa di +testo composta da una serie di proposizioni separate da spazi, ciascuna delle +quali specifica una operazione da eseguire per creare lo stato finale. Nella +rappresentazione si fa sempre conto di partire da uno stato in cui tutti gli +insiemi sono vuoti e si provvede a impostarne i contenuti. + +Ciascuna proposizione è nella forma di un elenco di capacità, espresso con i +nomi di tab.~\ref{tab:proc_capabilities} separati da virgole, seguito da un +operatore, e dall'indicazione degli insiemi a cui l'operazione si applica. I +nomi delle capacità possono essere scritti sia maiuscoli che minuscoli, viene +inoltre riconosciuto il nome speciale \texttt{all} che è equivalmente a +scrivere la lista completa. Gli insiemi sono identificati dalle tre lettere +iniziali: ``\texttt{p}'' per il \textit{permitted}, ``\texttt{i}'' per +l'\textit{inheritable} ed ``\texttt{e}'' per l'\textit{effective} che devono +essere sempre minuscole e se ne può indicare più di uno. + +Gli operatori possibili sono solo tre: ``\texttt{+}'' che aggiunge le capacità +elencate agli insiemi indicati, ``\texttt{-}'' che le toglie e ``\texttt{=}'' +che le assegna esattamente. I primi due richiedono che sia sempre indicato sia +un elenco di capacità che gli insiemi a cui esse devono applicarsi, e +rispettivamente attiveranno o disattiveranno le capacità elencate nell'insieme +o negli insiemi specificati, ignorando tutto il resto. I due operatori possono +anche essere combinati nella stessa proposizione, per aggiungere e togliere le +capacità dell'elenco da insiemi diversi. + +La assegnazione si applica invece su tutti gli insiemi allo stesso tempo, +pertanto l'uso di ``\texttt{=}'' è equivalente alla cancellazione preventiva +di tutte le capacità ed alla impostazione di quelle elencate negli insiemi +specificati, pertanto in genere lo si usa una sola volta all'inizio della +stringa. In tal caso l'elenco delle capacità può non essere indicato e viene +assunto che si stia facendo riferimento a tutte quante senza doverlo scrivere +esplicitamente. + +Come esempi avremo allora che un processo non privilegiato di un utente, che +non ha nessuna capacità attiva, avrà una rappresentazione nella forma +``\texttt{=}'' che corrisponde al fatto che nessuna capacità viene assegnata a +nessun insieme (vale la cancellazione preventiva), mentre un processo con +privilegi di amministratore avrà una rappresentazione nella forma +``\texttt{=ep}'' in cui tutte le capacità vengono assegnati agli insiemi +\textit{permitted} ed \textit{effective} (l' \textit{inheritable} è ignorato +in quanto per le regole viste a pag.~\ref{sec:capability-uid-transition} le +capacità verranno attivate attraverso una \func{exec}). Infine, come esempio +meno banale, otterremo per \texttt{init} una rappresentazione nella forma +``\texttt{=ep cap\_setpcap-e}'' dato che come accennato tradizionalmente +\const{CAP\_SETPCAP} è sempre stata rimossa da detto processo. Fin quei abbiamo trattato solo le funzioni di servizio relative alla -manipolazione dei \textit{capabilities state}; l'interfaccia di gestione -prevede però anche le funzioni per la gestione delle \textit{capabilities} -stesse. La prima di queste è \funcd{cap\_get\_proc} che consente la lettura -delle \textit{capabilities} del processo corrente, il suo prototipo è: +manipolazione dei \textit{capability state}; l'interfaccia di gestione prevede +però anche le funzioni per la gestione delle \textit{capabilities} stesse. La +prima di queste è \funcd{cap\_get\_proc} che consente la lettura delle +\textit{capabilities} del processo corrente, il suo prototipo è: \begin{functions} \headdecl{sys/capability.h} @@ -5515,7 +5628,7 @@ delle \textit{capabilities} del processo corrente, il suo prototipo è: La funzione legge il valore delle \textit{capabilities} associate al processo da cui viene invocata, restituendo il risultato tramite il puntatore ad un -\textit{capabilities state} contenente tutti i dati che provvede ad allocare +\textit{capability state} contenente tutti i dati che provvede ad allocare autonomamente e che di nuovo occorrerà liberare con \func{cap\_free} quando non sarà più utilizzato. @@ -5539,8 +5652,8 @@ prototipo\footnote{su alcune pagine di manuale la funzione è descritta con un %TODO controllare e correggere i codici di errore!!! La funzione legge il valore delle \textit{capabilities} del processo indicato -con l'argomento \param{pid}, e restituisce il risultato nel -\textit{capabilities state} posto all'indirizzo indicato con l'argomento +con l'argomento \param{pid}, e restituisce il risultato nel \textit{capability + state} posto all'indirizzo indicato con l'argomento \param{cap\_d}; a differenza della precedente in questo caso il \textit{capability state} deve essere stato creato in precedenza. Qualora il processo indicato non esista si avrà un errore di \errval{ESRCH}. Gli stessi diff --git a/listati/cap_user_header_t.h b/listati/cap_user_header_t.h index 791aa9e..6c260bf 100644 --- a/listati/cap_user_header_t.h +++ b/listati/cap_user_header_t.h @@ -1,12 +1,19 @@ -#define _LINUX_CAPABILITY_VERSION 0x19980330 +#define _LINUX_CAPABILITY_VERSION_1 0x19980330 +#define _LINUX_CAPABILITY_U32S_1 1 + +#define _LINUX_CAPABILITY_VERSION_2 0x20071026 /* deprecated - use v3 */ +#define _LINUX_CAPABILITY_U32S_2 2 + +#define _LINUX_CAPABILITY_VERSION_3 0x20080522 +#define _LINUX_CAPABILITY_U32S_3 2 typedef struct __user_cap_header_struct { - int version; + __u32 version; int pid; } *cap_user_header_t; typedef struct __user_cap_data_struct { - int effective; - int permitted; - int inheritable; + __u32 effective; + __u32 permitted; + __u32 inheritable; } *cap_user_data_t; diff --git a/othersock.tex b/othersock.tex index abf0f78..1509ff2 100644 --- a/othersock.tex +++ b/othersock.tex @@ -203,7 +203,7 @@ Se il socket è di un tipo che prevede le connessioni (ad esempio un socket TCP), questo deve essere già connesso prima di poter eseguire la funzione, in caso contrario si riceverà un errore di \errcode{ENOTCONN}. In questo specifico caso in cui gli argomenti \param{to} e \param{tolen} non servono -essi dovranno essere inizializzati rispettivamente a \const{NULL} e 0; +essi dovranno essere inizializzati rispettivamente a \val{NULL} e 0; normalmente quando si opera su un socket connesso essi vengono ignorati, ma qualora si sia specificato un indirizzo è possibile ricevere un errore di \errcode{EISCONN}. @@ -280,7 +280,7 @@ ritorno della funzione si otterranno i dati dell'indirizzo e la sua effettiva lunghezza, (si noti che \param{fromlen} è un valore intero ottenuto come \itindex{value~result~argument} \textit{value result argument}). Se non si è interessati a questa informazione, entrambi gli argomenti devono essere -inizializzati al valore \const{NULL}. +inizializzati al valore \val{NULL}. Una differenza fondamentale del comportamento di queste funzioni rispetto alle usuali \func{read} e \func{write} che abbiamo usato con i socket TCP è che in @@ -677,7 +677,7 @@ più necessario usare l'argomento \param{to} di \func{sendto} per specificare la destinazione dei pacchetti, che potranno essere inviati e ricevuti usando le normali funzioni \func{read} e \func{write}.\footnote{in realtà si può anche continuare ad usare la funzione \func{sendto}, ma in tal caso - l'argomento \param{to} deve essere inizializzato a \const{NULL}, e + l'argomento \param{to} deve essere inizializzato a \val{NULL}, e \param{tolen} deve essere inizializzato a zero, pena un errore.} Una volta che il socket è connesso cambia però anche il comportamento in diff --git a/process.tex b/process.tex index eba8b3c..09b2ea5 100644 --- a/process.tex +++ b/process.tex @@ -1177,7 +1177,7 @@ di scrittura oltre i limiti dei buffer allocati. Per questo motivo la funzione deve essere chiamata prima di qualunque allocazione di memoria, altrimenti fallirà con un valore di ritorno pari a $-1$. -Se come argomento di \func{mcheck} si passa \var{NULL} verrà utilizzata una +Se come argomento di \func{mcheck} si passa \val{NULL} verrà utilizzata una funzione predefinita che stampa un messaggio di errore ed invoca la funzione \func{abort} (vedi sez.~\ref{sec:sig_alarm_abort}), altrimenti si dovrà create una funzione personalizzata che verrà eseguita ricevendo un unico argomento di diff --git a/prochand.tex b/prochand.tex index e3aa1e0..78ad88d 100644 --- a/prochand.tex +++ b/prochand.tex @@ -3307,7 +3307,7 @@ proprietà e caratteristiche particolari dei processi non coperte da esse, per la cui gestione è stata predisposta una apposita \textit{system call} che fornisce una interfaccia generica per tutte le operazioni specialistiche. La funzione è \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è - standardizzata ed è specifica di Linux, anche se ne esiete una analoga in + standardizzata ed è specifica di Linux, anche se ne esiste una analoga in IRIX, è stata introdotta con il kernel 2.1.57.} \begin{functions} \headdecl{sys/prctl.h} @@ -3345,10 +3345,11 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: nell'argomento \param{arg2} con una delle costanti di tab.~\ref{tab:proc_capabilities} dal \textit{capabilities bounding set} del processo. L'operazione richiede i privilegi di amministratore (la capacità - \const{CAP\_SETPCAP}), altrimenti fallisce con un errore di \errval{EPERM}; - se il valore di \param{arg2} non è valido o se il supporto per le - \textit{file capabilities} non è stato compilato nel kernel fallisce con un - errore di \errval{EINVAL}. Introdotta a partire dal kernel 2.6.25. + \const{CAP\_SETPCAP}), altrimenti la chiamata fallirà con un errore di + \errval{EPERM}; se il valore di \param{arg2} non è valido o se il supporto + per le \textit{file capabilities} non è stato compilato nel kernel la + chiamata fallirà con un errore di \errval{EINVAL}. Introdotta a partire dal + kernel 2.6.25. \item[\const{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la terminazione di un processo a causa di un segnale per il quale è prevista la generazione di un file di \itindex{core~dump} \textit{core dump} (vedi @@ -3389,7 +3390,8 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: di \param{arg2}, si deve passare \const{PR\_FPEMU\_NOPRINT} per emulare in maniera trasparente l'accesso alle operazioni in virgola mobile, o \const{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale - \const{SIGFPE}. Introdotta a partire dal kernel 2.4.18, solo su ia64. + \const{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire + dal kernel 2.4.18, solo su ia64. \item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo dell'emulazione della virgola mobile, salvato all'indirizzo puntato da \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a @@ -3402,10 +3404,10 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: per gli underflow, \const{PR\_FP\_EXC\_RES} per risultati non esatti, \const{PR\_FP\_EXC\_INV} per operazioni invalide, \const{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni, - \const{PR\_FP\_EXC\_NONRECOV} per utilizzare la modalità di eccesione + \const{PR\_FP\_EXC\_NONRECOV} per utilizzare la modalità di eccezione asincrona non recuperabile, \const{PR\_FP\_EXC\_ASYNC} per utilizzare la - modalità di eccesione asincrona recuperabile, \const{PR\_FP\_EXC\_PRECISE} - per la modalita precisa di eccezione.\footnote{trattasi di gestione + modalità di eccezione asincrona recuperabile, \const{PR\_FP\_EXC\_PRECISE} + per la modalità precisa di eccezione.\footnote{trattasi di gestione specialistica della gestione delle eccezioni dei calcoli in virgola mobile che, i cui dettagli al momento vanno al di là dello scopo di questo testo.} Introdotta a partire dal kernel 2.4.21, solo su PowerPC. @@ -3419,10 +3421,10 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a pag.~\pageref{sec:capability-uid-transition}). Un valore nullo (il default) per \param{arg2} comporta che vengano cancellate, il valore 1 che vengano - manenute, questo valore viene sempre cancellato attraverso una - \func{exec}. L'uso di questo flag è stato sostituito, a partire dal kernel - 2.6.26, dal flag \const{SECURE\_KEEP\_CAPS} dei \itindex{securebits} - \textit{securebits} (vedi \const{PR\_SET\_SECUREBITS}). Introdotta a partire + mantenute, questo valore viene sempre cancellato attraverso una \func{exec}. + L'uso di questo flag è stato sostituito, a partire dal kernel 2.6.26, dal + flag \const{SECURE\_KEEP\_CAPS} dei \itindex{securebits} \textit{securebits} + (vedi l'uso di \const{PR\_SET\_SECUREBITS} più avanti). Introdotta a partire dal kernel 2.2.18. \item[\const{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione il valore del flag di controllo impostato con @@ -3437,11 +3439,11 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: se più corto. Introdotta a partire dal kernel 2.6.9. \item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un segnale, che sarà ricevuto dal processo chiamante, in occorrenza della - terminazione del proprio processo padre.\footnote{in sostanza consente di - invertire il ruolo di \const{SIGCHLD}.} Il valore di \param{arg2} deve - indicare il numero del segnale, o 0 per disabilitare l'emissione. Il valore - viene automaticamente cancellato per un processo figlio creato con - \func{fork}. Introdotta a partire dal kernel 2.1.57. + terminazione del proprio processo padre; in sostanza consente di invertire + il ruolo di \const{SIGCHLD}. Il valore di \param{arg2} deve indicare il + numero del segnale, o 0 per disabilitare l'emissione. Il valore viene + automaticamente cancellato per un processo figlio creato con \func{fork}. + Introdotta a partire dal kernel 2.1.57. \item[\const{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale emesso alla terminazione del padre, salvato all'indirizzo puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a @@ -3453,15 +3455,16 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: processo potrà utilizzare soltanto un insieme estremamente limitato di \textit{system call}: \func{read}, \func{write}, \func{\_exit} e \func{sigreturn}, ogni altra \textit{system call} porterà all'emissione di - un \func{SIGKILL}. Il \textit{secure computing mode} è stato ideato per - fornire un supporto per l'esecuzione di codice esterno non fidato e non - verificabile a scopo di calcolo;\footnote{lo scopo è quello di poter vendere - la capacità di calcolo della proprio macchina ad un qualche servizio di - calcolo distribuito senza comprometterne la sicurezza eseguendo codice non - sotto il proprio controllo.} in genere i dati vengono letti o scritti - grazie ad un socket o una pipe, e per evitare problemi di sicurezza non sono - possibili altre operazioni se non quelle citate. Introdotta a partire dal - kernel 2.6.23, disponibile solo se si è abilitato il supporto nel kernel con + un \func{SIGKILL} (vedi sez.~\ref{sec:sig_termination}). Il \textit{secure + computing mode} è stato ideato per fornire un supporto per l'esecuzione di + codice esterno non fidato e non verificabile a scopo di calcolo;\footnote{lo + scopo è quello di poter vendere la capacità di calcolo della proprio + macchina ad un qualche servizio di calcolo distribuito senza + comprometterne la sicurezza eseguendo codice non sotto il proprio + controllo.} in genere i dati vengono letti o scritti grazie ad un socket o + una pipe, e per evitare problemi di sicurezza non sono possibili altre + operazioni se non quelle citate. Introdotta a partire dal kernel 2.6.23, + disponibile solo se si è abilitato il supporto nel kernel con \texttt{CONFIG\_SECCOMP}. \item[\const{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione lo stato corrente del \textit{secure computing mode}, al momento attuale la @@ -3470,10 +3473,13 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: comporterebbe l'emissione di \texttt{SIGKILL}, è stata comunque definita per eventuali estensioni future. Introdotta a partire dal kernel 2.6.23. \item[\const{PR\_SET\_SECUREBITS}] Imposta i \itindex{securebits} - \textit{securebits} per il processo corrente al valore indicato - da \param{arg2}; per i dettagli si veda sez.~\ref{sec:proc_capabilities}, ed - in particolare i valori di tab.~\ref{tab:securebits_values} e la relativa - trattazione. Introdotta a partire dal kernel 2.6.26. + \textit{securebits} per il processo chiamante al valore indicato + da \param{arg2}; per i dettagli sul significato dei \textit{securebits} si + veda sez.~\ref{sec:proc_capabilities}, ed in particolare i valori di + tab.~\ref{tab:securebits_values} e la relativa trattazione. L'operazione + richiede i privilegi di amministratore (la capacità \const{CAP\_SETPCAP}), + altrimenti la chiamata fallirà con un errore di \errval{EPERM}. Introdotta a + partire dal kernel 2.6.26. \item[\const{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della funzione l'impostazione corrente per i \itindex{securebits} \textit{securebits}. Introdotta a partire dal kernel 2.6.26. @@ -3487,16 +3493,17 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: \item[\const{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione il metodo di temporizzazione del processo attualmente in uso. Introdotta a partire dal kernel 2.6.0-test4. -\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo può - leggere il registro di processore contenente il contatore dei +\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo + chiamante può leggere il registro di processore contenente il contatore dei \textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il valore di \param{arg2}. Si deve specificare \const{PR\_TSC\_ENABLE} per abilitare la lettura o \const{PR\_TSC\_SIGSEGV} per disabilitarla con la - generazione di un segnale di \const{SIGSEGV}. La lettura viene - automaticamente disabilitata se si attiva il \textit{secure computing mode}. - Introdotta a partire dal kernel 2.6.26, solo su x86. + generazione di un segnale di \const{SIGSEGV} (vedi + sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente + disabilitata se si attiva il \textit{secure computing mode}. Introdotta a + partire dal kernel 2.6.26, solo su x86. \item[\const{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la - lettura del contatatore dei \textit{timestamp}, salvato all'indirizzo + lettura del contattore dei \textit{timestamp}, salvato all'indirizzo puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a partire dal kernel 2.6.26, solo su x86. % articoli sul TSC e relativi problemi: http://lwn.net/Articles/209101/, @@ -3504,17 +3511,64 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: % http://en.wikipedia.org/wiki/Time_Stamp_Counter \item[\const{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso a indirizzi di memoria non allineati, che in varie architetture risultano - illegali, da indicare con il valore di \param{arg2}. Si deve specificare - \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati, e - \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di \const{SIGBUS} in - caso di accesso non allineato. Introdotta con diverse versioni su diverse - architetture. + illegali, da indicare con il valore di \param{arg2}. Si deve specificare il + valore \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati, + ed il valore \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di + \const{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non + allineato. Introdotta con diverse versioni su diverse architetture. \item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta con diverse versioni su diverse architetture. -\item[\const{PR\_MCE\_KILL}] Introdotta a partire dal kernel 2.6.32. -\item[\const{PR\_MCE\_KILL\_GET}] Introdotta a partire dal kernel 2.6.32. +\item[\const{PR\_MCE\_KILL}] Imposta la politica di gestione degli errori + dovuti a corruzione della memoria per problemi hardware. Questo tipo di + errori vengono riportati dall'hardware di controllo della RAM e vengono + gestiti dal kernel,\footnote{la funzionalità è disponibile solo sulle + piattaforme più avanzate che hanno il supporto hardware per questo tipo di + controlli.} ma devono essere opportunamente riportati ai processi che + usano quella parte di RAM che presenta errori; nel caso specifico questo + avviene attraverso l'emissione di un segnale di \const{SIGBUS} (vedi + sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche + impostato il valore di \var{si\_code} in \struct{siginfo\_t} a + \const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia + riferimento alla trattazione di sez.~\ref{sec:sig_sigaction}.} + + Il comportamento di default prevede che per tutti i processi si applichi la + politica generale di sistema definita nel file + \procfile{/proc/sys/vm/memory\_failure\_early\_kill}, ma specificando + per \param{arg2} il valore \const{PR\_MCE\_KILL\_SET} è possibile impostare + con il contenuto di \param{arg3} una politica specifica del processo + chiamante. Si può tornare alla politica di default del sistema utilizzando + invece per \param{arg2} il valore \const{PR\_MCE\_KILL\_CLEAR}. In tutti i + casi, per compatibilità con eventuali estensioni future, tutti i valori + degli argomenti non utilizzati devono essere esplicitamente posti a zero, + pena il fallimento della chiamata con un errore di \errval{EINVAL}. + + In caso di impostazione di una politica specifica del processo con + \const{PR\_MCE\_KILL\_SET} i valori di \param{arg3} possono essere soltanto + due, che corrispondono anche al valore che si trova nell'impostazione + generale di sistema di \texttt{memory\_failure\_early\_kill}, con + \const{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di + \const{SIGBUS} non appena viene rilevato un errore, mentre con + \const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo + tenterà un accesso alla memoria corrotta. Questi due valori corrispondono + rispettivamente ai valori 1 e 0 di + \texttt{memory\_failure\_early\_kill}.\footnote{in sostanza nel primo caso + viene immediatamente inviato il segnale a tutti i processi che hanno la + memoria corrotta mappata all'interno del loro spazio degli indirizzi, nel + secondo caso prima la pagina di memoria viene tolta dallo spazio degli + indirizzi di ciascun processo, mentre il segnale viene inviato solo quei + processi che tentano di accedervi.} Si può usare per \param{arg3} anche un + terzo valore, \const{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare + per il processo la politica di default.\footnote{si presume la politica di + default corrente, in modo da non essere influenzati da un eventuale + successivo cambiamento della stessa.} Introdotta a partire dal kernel + 2.6.32. +\item[\const{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della + funzione la politica di gestione degli errori dovuti a corruzione della + memoria. Tutti gli argomenti non utilizzati (al momento tutti) devono essere + nulli pena la ricezione di un errore di \errval{EINVAL}. Introdotta a + partire dal kernel 2.6.32. \label{sec:prctl_operation} \end{basedescript} @@ -3747,10 +3801,15 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso % LocalWords: CONTINUED sources forking Spawned successfully executing exiting % LocalWords: next cat for COMMAND pts bash defunct TRAPPED DUMPED Killable PR % LocalWords: SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO -% LocalWords: Completely Fair compat Uniform CFQ Queuing elevator dev cfq RT -% LocalWords: Documentation block syscall ioprio IPRIO CLASS class best effort -% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE SIGCHL WALL -% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS +% LocalWords: completely fair compat uniform CFQ queuing elevator dev cfq RT +% LocalWords: documentation block syscall ioprio IPRIO CLASS class best effort +% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE SIGCHL WALL big +% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian +% LocalWords: little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW +% LocalWords: exception EXC ENABLE OVF overflow UND underflow RES INV DISABLED +% LocalWords: NONRECOV ASYNC KEEP securebits NAME NUL PDEATHSIG SECCOMP +% LocalWords: secure computing sigreturn TIMING STATISTICAL TSC MCE +% LocalWords: timestamp Stamp SIGSEGV UNALIGN SIGBUS MCEERR AO failure early %%% Local Variables: %%% mode: latex diff --git a/sockctrl.tex b/sockctrl.tex index 9e09813..82c5597 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -887,7 +887,7 @@ usare la funzione \funcd{gethostbyaddr}, il cui prototipo è: Richiede la risoluzione inversa di un indirizzo IP. \bodydesc{La funzione restituisce l'indirizzo ad una struttura - \struct{hostent} in caso di successo ed \const{NULL} in caso di errore.} + \struct{hostent} in caso di successo ed \val{NULL} in caso di errore.} \end{functions} In questo caso l'argomento \param{addr} dovrà essere il puntatore ad una @@ -939,7 +939,7 @@ cui prototipi sono: indirizzo IP. \bodydesc{Entrambe le funzioni restituiscono l'indirizzo ad una struttura - \struct{hostent} in caso di successo ed \const{NULL} in caso di errore.} + \struct{hostent} in caso di successo ed \val{NULL} in caso di errore.} \end{functions} Entrambe le funzioni supportano esplicitamente la scelta di una famiglia di @@ -1077,7 +1077,7 @@ il nome e viceversa; i loro prototipi sono: Risolvono il nome di un servizio nel rispettivo numero di porta e viceversa. \bodydesc{Ritornano il puntatore ad una struttura \struct{servent} con i - risultati in caso di successo, o \const{NULL} in caso di errore.} + risultati in caso di successo, o \val{NULL} in caso di errore.} \end{functions} Entrambe le funzioni prendono come ultimo argomento una stringa \param{proto} @@ -1150,7 +1150,7 @@ dei servizi avremo allora le tre funzioni \funcd{setservent}, \bodydesc{Le due funzioni \func{setservent} e \func{endservent} non restituiscono nulla, \func{getservent} restituisce il puntatore ad una - struttura \struct{servent} in caso di successo e \const{NULL} in caso di + struttura \struct{servent} in caso di successo e \val{NULL} in caso di errore o fine del file.} \end{functions} @@ -1250,7 +1250,7 @@ forma \textit{dotted-decimal} per IPv4 o in formato esadecimale per IPv6. Si può anche specificare il nome di una rete invece che di una singola macchina. Il secondo argomento, \param{service}, specifica invece il nome del servizio che si intende risolvere. Per uno dei due argomenti si può anche usare il -valore \const{NULL}, nel qual caso la risoluzione verrà effettuata soltanto +valore \val{NULL}, nel qual caso la risoluzione verrà effettuata soltanto sulla base del valore dell'altro. Il terzo argomento, \param{hints}, deve essere invece un puntatore ad una @@ -1308,7 +1308,7 @@ risultato, \var{ai\_next} è un puntatore alla successiva struttura \struct{addrinfo} della lista. Ovviamente non è necessario dare dei suggerimenti in ingresso, ed usando -\const{NULL} come valore per l'argomento \param{hints} si possono compiere +\val{NULL} come valore per l'argomento \param{hints} si possono compiere ricerche generiche. Se però si specifica un valore non nullo questo deve puntare ad una struttura \struct{addrinfo} precedentemente allocata nella quale siano stati opportunamente impostati i valori dei campi @@ -1344,7 +1344,7 @@ nella selezione. \const{AI\_PASSIVE} & Viene utilizzato per ottenere un indirizzo in formato adatto per una successiva chiamata a \func{bind}. Se specificato quando si è usato - \const{NULL} come valore per \param{node} gli + \val{NULL} come valore per \param{node} gli indirizzi restituiti saranno inizializzati al valore generico (\const{INADDR\_ANY} per IPv4 e \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti @@ -1411,7 +1411,7 @@ corrispondente è riportato tramite \var{errno}. validi. \\ \const{EAI\_NONAME} & Il nome a dominio o il servizio non sono noti, viene usato questo errore anche quando si specifica - il valore \const{NULL} per entrambi gli argomenti + il valore \val{NULL} per entrambi gli argomenti \param{node} e \param{service}. \\ \const{EAI\_SERVICE} & Il servizio richiesto non è disponibile per il tipo di socket richiesto, anche se può esistere per @@ -1630,7 +1630,7 @@ I risultati della funzione saranno restituiti nelle due stringhe puntate da \param{host} e \param{serv}, che dovranno essere state precedentemente allocate per una lunghezza massima che deve essere specificata con gli altri due argomenti \param{hostlen} e \param{servlen}. Si può, quando non si è -interessati ad uno dei due, passare il valore \const{NULL} come argomento, +interessati ad uno dei due, passare il valore \val{NULL} come argomento, così che la corrispondente informazione non verrà richiesta. Infine l'ultimo argomento \param{flags} è una maschera binaria i cui bit consentono di impostare le modalità con cui viene eseguita la ricerca, e deve essere @@ -1802,7 +1802,7 @@ indirizzo specifico come argomento di \func{bind}, che consente di porre il server in ascolto su uno solo dei possibili diversi indirizzi presenti su di una macchina. Se non si vuole che la funzione esegua \func{bind} su un indirizzo specifico, ma utilizzi l'indirizzo generico, occorrerà avere cura di -passare un valore \const{NULL} come valore per l'argomento \var{host}; l'uso +passare un valore \val{NULL} come valore per l'argomento \var{host}; l'uso del valore \const{AI\_PASSIVE} serve ad ottenere il valore generico nella rispettiva struttura degli indirizzi. @@ -1960,7 +1960,7 @@ La gran parte delle opzioni utilizzano per \param{optval} un valore intero, se poi l'opzione esprime una condizione logica, il valore è sempre un intero, ma si dovrà usare un valore non nullo per abilitarla ed un valore nullo per disabilitarla. Se invece l'opzione non prevede di dover ricevere nessun tipo -di valore si deve impostare \param{optval} a \const{NULL}. Un piccolo numero +di valore si deve impostare \param{optval} a \val{NULL}. Un piccolo numero di opzioni però usano dei tipi di dati peculiari, è questo il motivo per cui \param{optval} è stato definito come puntatore generico. diff --git a/system.tex b/system.tex index 7ed9fe9..39b73d9 100644 --- a/system.tex +++ b/system.tex @@ -929,13 +929,12 @@ tralasceremo la trattazione, rimandando al manuale delle \acr{glibc} % TODO documentare keyctl ???? % (fare sezione dedicata ????) -%\subsection{La gestione delle chiavi} +%\subsection{La gestione delle chiavi crittografiche} %\label{sec:keyctl_management} - % % \subsection{La gestione dello spegnimento e del riavvio} -\label{sec:sys_reboot} +%\label{sec:sys_reboot} % TODO trattare reboot, kexec_load, ... @@ -1799,7 +1798,7 @@ La funzione attiva il salvataggio dei dati sul file indicato dal pathname contenuti nella stringa puntata da \param{filename}; la funzione richiede che il processo abbia i privilegi di amministratore (è necessaria la \itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi -sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \const{NULL} per +sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per \param{filename} il \textit{BSD accounting} viene invece disabilitato. Un semplice esempio per l'uso di questa funzione è riportato nel programma \texttt{AcctCtrl.c} dei sorgenti allegati alla guida. -- 2.30.2