Após seis meses de desenvolvimento, foi lançado o release da biblioteca do sistema GNU C Library (glibc) 2.35, que atende integralmente aos padrões ISO C11 e POSIX.1-2017. A nova versão inclui correções de 66 desenvolvedores.
Entre as melhorias implementadas no Glibc 2.35, destacam-se:
- Foi adicionada a suporte à localidade "C.UTF-8", que inclui regras de ordenação para todos os códigos Unicode, mas, para economizar espaço, é limitada ao uso de intervalos ASCII nas funções fnmatch, regexec e regcomp. A localidade ocupa cerca de 400 KB, dos quais 346 KB correspondem aos dados LC_CTYPE para Unicode, e requer instalação separada (não está embutida na Glibc).
- Os dados de codificação, informações sobre tipos de caracteres e tabelas de transliteração foram atualizados para suportar a especificação Unicode 14.0.0.
- Em <math.h> e <tgmath.h>, foram implementadas funções e macros que arredondam o resultado para um tipo mais restrito: fsqrt, fsqrtl, dsqrtl, ffma, ffmal, dfmal, fMsqrtfN, fMsqrtfNx, fMxsqrtfN, fMxsqrtfNx, fMfmafN, fMfmafNx, fMxfmafN e fMxfmafNx. As funções estão descritas nas especificações TS 18661-1:2014, TS 18661-3:2015 e foram adicionadas ao rascunho da futura norma ISO C2X.
- Em <math.h> e <tgmath.h>, foram implementadas funções e macros para encontrar o mínimo e máximo de números de ponto flutuante com tipos float, long double, _FloatN e _FloatNx, descritas na especificação IEEE 754-2019 e adicionadas ao rascunho da futura norma ISO C2X: fmaximum, fmaximum_num, fmaximum_mag, fmaximum_mag_num, fminimum, fminimum_num, fminimum_mag e fminimum_mag_num.
- Em <math.h>, foram adicionadas constantes para números de ponto flutuante de precisão única: M_Ef, M_LOG2Ef, M_LOG10Ef, M_LN2f, M_LN10f, M_PIf, M_PI_2f, M_PI_4f, M_1_PIf, M_2_PIf, M_2_SQRTPIf, M_SQRT2f e M_SQRT1_2f.
- Para a função exp10, foram adicionados macros correspondentes ao cabeçalho <tgmath.h>, não vinculados a tipos específicos.
- Em <stdio.h>, foi adicionado o macro _PRINTF_NAN_LEN_MAX, proposto no rascunho do padrão ISO C2X.
- Na família de funções printf, foram adicionados especificadores de formato "%b" e "%B" para a saída de números inteiros na representação binária.
- Um novo algoritmo de ordenação DSO foi implementado no sistema de ligação dinâmica, utilizando o método de busca em profundidade (DFS) para resolver problemas de desempenho ao processar dependências cíclicas. Para escolher o algoritmo de ordenação DSO, foi proposto o parâmetro glibc.rtld.dynamic_sort, que pode ser definido como "1" para reverter para o algoritmo antigo.
- O ABI adicionou suporte a uma nova função ‘__memcmpeq’, utilizada pelos compiladores para otimizar o uso de ‘memcmp’, caso o valor retornado por essa função seja usado apenas para verificar o status da conclusão da operação.
- Foi adicionado suporte ao registro automático de threads, usando a chamada de sistema rseq (sequências reiniciáveis), disponível a partir do núcleo Linux 4.18. A chamada de sistema rseq permite organizar a execução ininterrupta de um grupo de instruções, que não é interrompida e confirma o resultado da última instrução no grupo. Basicamente, fornece um meio para a execução atômica muito rápida de operações que, em caso de interrupção por outro thread, são limpas e uma nova tentativa de execução é realizada.
- Foi adicionada um link simbólico /usr/bin/ld.so.
- Foi garantida a construção padrão de todos os arquivos executáveis de programas incorporados e do conjunto de testes em modo PIE (executável independente de posição). Para desativar esse comportamento, há a opção ‘—disable-default-pie’.
- Para o Linux, foi adicionada a configuração glibc.malloc.hugetlb, que permite alternar a implementação do malloc para usar a chamada de sistema madvise com a flag MADV_HUGEPAGE para mmap e sbrk ou usar diretamente páginas de memória grandes através da indicação da flag MAP_HUGETLB nas chamadas mmap. No primeiro caso, é possível aumentar o desempenho se as Transparent Huge Pages forem usadas no modo madvise, enquanto no segundo, há a possibilidade de usar páginas grandes reservadas pelo sistema (Huge Pages).
- Foi adicionada a função _dl_find_object, que pode ser usada para adicionar informações sobre a desmontagem da pilha de chamadas (unwind).
- Foi adicionado suporte à arquitetura OpenRISC (or1k-linux-gnu) no modo de processamento de operações de ponto flutuante por software (soft-float). Para o funcionamento da porta, requer-se binutils 2.35, GCC 11 e núcleo Linux 5.4.
- Foi adicionado o sinalizador de compilação ‘—with-rtld-early-cflags’, que permite especificar flags adicionais de compilação usadas na construção do código inicial para o link dinâmico.
- Para a plataforma Linux, foi adicionada a função epoll_pwait2, que se diferencia do epoll_wait ao especificar um tempo limite com precisão nanosegundária.
- Foi adicionada a função posix_spawn_file_actions_addtcsetpgrp_np, que elimina condições de corrida ao definir o terminal controlador para um novo processo.
- Para aplicativos compilados com Glibc e GCC 12+, foi implementado o modo de proteção «_FORTIFY_SOURCE=3», que detecta possíveis transbordamentos de buffer durante a execução de funções de string definidas no arquivo de cabeçalho string.h. A diferença em relação ao modo «_FORTIFY_SOURCE=2» reside em verificações adicionais que podem potencialmente afetar o desempenho.
- O suporte às extensões Intel MPX (Memory Protection Extensions), utilizadas para verificar os ponteiros quanto ao cumprimento das fronteiras de áreas de memória (essa tecnologia não se popularizou e já foi removida do GCC e do LLVM), foi descontinuado.
- O mecanismo prelink e as variáveis de ambiente LD_TRACE_PRELINKING e LD_USE_LOAD_BIAS foram declarados obsoletos e serão removidos na próxima versão.
Vulnerabilidades corrigidas:
- CVE-2022-23218, CVE-2022-23219 — transbordamento de buffer nas funções svcunix_create e clnt_create, causado pela cópia no stack do conteúdo do parâmetro com o nome do arquivo sem verificação do tamanho dos dados copiados. Para aplicativos compilados sem proteção de stack e que utilizam o protocolo «unix», a vulnerabilidade pode levar à execução de código malicioso ao processar nomes de arquivos muito longos.
- CVE-2021-3998 — vulnerabilidade na função realpath(), causada pelo retorno de um valor incorreto sob certas condições, contendo dados residuais não filtrados do stack. Para o programa SUID-root fusermount, a vulnerabilidade pode ser explorada para obter informações confidenciais da memória do processo, como dados sobre ponteiros.
- CVE-2021-3999 — transbordamento de buffer de um byte na função getcwd(). O problema é causado por um erro presente desde 1995. Para causar o transbordamento, basta chamar chdir() para o diretório «/» em um namespace separado de pontos de montagem.
Fonte: opennet.ru
