Dopo sei mesi di sviluppo, è stata pubblicata la versione 2.35 della libreria di sistema GNU C Library (glibc), che soddisfa completamente i requisiti degli standard ISO C11 e POSIX.1-2017. Questa nuova release include correzioni da 66 sviluppatori.
Tra i miglioramenti realizzati in Glibc 2.35, si segnala:
- È stata aggiunta la supporto per la locale «C.UTF-8», che include regole di ordinamento per tutti i codici Unicode, ma per risparmiare spazio è limitata all’utilizzo dei codici ASCII nelle funzioni fnmatch, regexec e regcomp. La locale occupa circa 400 KB, di cui 346 KB sono dati LC_CTYPE per Unicode, e richiede un’installazione separata (non è inclusa in Glibc).
- I dati delle codifiche, le informazioni sui tipi di caratteri e le tabelle di translitterazione sono stati aggiornati per supportare la specifica Unicode 14.0.0.
- Nel <math.h> e <tgmath.h> sono state implementate funzioni e macro che arrotondano il risultato a un tipo più ristretto: fsqrt, fsqrtl, dsqrtl, ffma, ffmal, dfmal, fMsqrtfN, fMsqrtfNx, fMxsqrtfN, fMxsqrtfNx, fMfmafN, fMfmafNx, fMxfmafN e fMxfmafNx. Le funzioni sono descritte nelle specifiche TS 18661-1:2014, TS 18661-3:2015 e sono state aggiunte alla bozza del futuro standard C ISO C2X.
- In
- In
- For the exp10 functions, corresponding macros not tied to specific types have been added to the header file.
- In , the macro _PRINTF_NAN_LEN_MAX has been added, as proposed in the ISO C2X standard draft.
- Format specifiers "%b" and "%B" have been added to printf family functions for outputting integers in binary representation.
- Nel sistema di collegamento dinamico è stato implementato un nuovo algoritmo di ordinamento DSO, che utilizza il metodo di ricerca in profondità (DFS) per risolvere i problemi di prestazioni durante l'elaborazione di dipendenze cicliche. È stato introdotto un parametro glibc.rtld.dynamic_sort per selezionare l'algoritmo di ordinamento DSO, al quale può essere assegnato il valore "1" per tornare indietro al vecchio algoritmo.
- Nell'ABI è stato aggiunto il supporto per la nuova funzione ‘__memcmpeq’, utilizzata dai compilatori per ottimizzare l'uso di ‘memcmp’, nel caso in cui il valore restituito da questa funzione venga utilizzato solo per verificare lo stato di completamento dell'operazione.
- È stato aggiunto il supporto per la registrazione automatica dei thread, utilizzando la chiamata di sistema rseq (sequences riavviabili), fornita a partire dal kernel Linux 4.18. La chiamata di sistema rseq consente di organizzare l'esecuzione ininterrotta di un gruppo di istruzioni, non interrotta e confermando il risultato dell'ultima istruzione del gruppo. In sostanza, offre un mezzo per eseguire in modo atomico operazioni molto veloci, che, in caso di interruzione da parte di un altro thread, vengono annullate e si tenta nuovamente l'esecuzione.
- È stata aggiunta un collegamento simbolico a /usr/bin/ld.so.
- È stata garantita la compilazione predefinita di tutti i file eseguibili delle utility integrate e del set di test in modalità PIE (position independent executable). Per disattivare questo comportamento, è prevista l'opzione «—disable-default-pie».
- Per Linux è stata aggiunta l'impostazione glibc.malloc.hugetlb, che consente di passare all'implementazione di malloc utilizzando la chiamata di sistema madvise con il flag MADV_HUGEPAGE per mmap e sbrk, o di utilizzare direttamente le pagine di memoria grandi passando il flag MAP_HUGETLB nelle chiamate mmap. Nel primo caso si può ottenere un aumento delle prestazioni se le Transparent Huge Pages sono utilizzate in modalità madvise, mentre nel secondo caso si fornisce la possibilità di utilizzare le pagine grandi riservate dal sistema (Huge Pages).
- È stata aggiunta la funzione _dl_find_object, che può essere utilizzata per aggiungere informazioni sullo unwind dello stack delle chiamate.
- È stato aggiunto il supporto per l'architettura OpenRISC (or1k-linux-gnu) in modalità di gestione software delle operazioni in virgola mobile (soft-float). Per il funzionamento del porting è necessario binutils 2.35, GCC 11 e il kernel Linux 5.4.
- È stato aggiunto il flag di compilazione «--with-rtld-early-cflags», che consente di specificare ulteriori flag di compilazione utilizzati nella costruzione del codice iniziale per il collegamento dinamico.
- Per la piattaforma Linux è stata aggiunta la funzione epoll_pwait2, che differisce da epoll_wait poiché specifica un timeout con precisione nanosecondi.
- È stata aggiunta la funzione posix_spawn_file_actions_addtcsetpgrp_np, che elimina le condizioni di gara nell'impostazione del terminale di controllo per un nuovo processo.
- Per le applicazioni compilate con Glibc e GCC 12+, è stata implementata la modalità di protezione «_FORTIFY_SOURCE=3», che individua possibili buffer overflow durante l'esecuzione di funzioni di stringa definite nell'intestazione string.h. La differenza rispetto alla modalità «_FORTIFY_SOURCE=2» sta in controlli aggiuntivi che potrebbero potenzialmente ridurre le prestazioni.
- È stata interrotta la supporto per le estensioni Intel MPX (Memory Protection Extensions), utilizzate per verificare i puntatori contro il rispetto dei confini delle aree di memoria (questa tecnologia non ha avuto diffusione ed è già stata rimossa da GCC e LLVM).
- Il meccanismo prelink e le relative variabili di ambiente LD_TRACE_PRELINKING e LD_USE_LOAD_BIAS sono stati dichiarati obsoleti e saranno rimossi nel prossimo rilascio.
Vulnerabilità risolte:
- CVE-2022-23218, CVE-2022-23219 — overflow del buffer nelle funzioni svcunix_create e clnt_create, causato dalla copia nello stack del contenuto del parametro con il nome file senza controllare la dimensione dei dati copiati. Per le applicazioni compilate senza protezione dello stack e che utilizzano il protocollo 'unix', la vulnerabilità può permettere l'esecuzione di codice da parte di un attaccante durante l'elaborazione di nomi di file molto lunghi.
- CVE-2021-3998 — vulnerabilità nella funzione realpath(), causata dal ritorno di un valore non corretto in determinate condizioni, contenente dati residui non puliti dallo stack. Per il programma SUID-root fusermount, la vulnerabilità può essere sfruttata per ottenere informazioni riservate dalla memoria del processo, ad esempio, per accedere a informazioni sui puntatori.
- CVE-2021-3999 — overflow del buffer a singolo byte nella funzione getcwd(). Il problema è causato da un difetto presente fin dal 1995. Per attivare l'overflow è sufficiente eseguire una chiamata a chdir() per la directory '/' in un namespace di montaggio separato.
Fonte: opennet.ru
