Después de seis meses de desarrollo, se ha publicado la versión de la biblioteca del sistema GNU C Library (glibc) 2.35, que cumple completamente con los requisitos de las normas ISO C11 y POSIX.1-2017. La nueva versión incluye correcciones de 66 desarrolladores.
Entre las mejoras implementadas en Glibc 2.35 se destacan:
- Se ha añadido soporte para la configuración regional "C.UTF-8", que incluye reglas de ordenación para todos los códigos Unicode, pero limitada en su uso al rango ASCII en las funciones fnmatch, regexec y regcomp para economizar espacio. La configuración regional ocupa alrededor de 400 KB, de los cuales 346 KB son datos LC_CTYPE para Unicode, y requiere instalación separada (no está integrada en Glibc).
- Los datos de codificación, la información sobre tipos de caracteres y las tablas de transliteración se han actualizado para soportar la especificación Unicode 14.0.0.
- En <math.h> y <tgmath.h> se han implementado funciones y macros que redondean el resultado a un tipo más estrecho: fsqrt, fsqrtl, dsqrtl, ffma, ffmal, dfmal, fMsqrtfN, fMsqrtfNx, fMxsqrtfN, fMxsqrtfNx, fMfmafN y fMfmafNx. Las funciones están descritas en las especificaciones TS 18661-1:2014, TS 18661-3:2015 y se han añadido al borrador del futuro estándar ISO C2X.
- En <math.h> y <tgmath.h> se han implementado funciones y macros para encontrar el mínimo y el máximo de números de punto flotante con tipos float, long double, _FloatN y _FloatNx, descritos en la especificación IEEE 754-2019 y añadidos al borrador del futuro estándar ISO C2X: fmaximum, fmaximum_num, fmaximum_mag, fmaximum_mag_num, fminimum, fminimum_num, fminimum_mag, fminimum_mag_num.
- En <math.h> se han añadido constantes para números de punto flotante de precisión simple: 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 y M_SQRT1_2f.
- Para las funciones exp10, se han añadido macros correspondientes al archivo de encabezado <tgmath.h> que no están vinculadas a tipos específicos.
- En <stdio.h> se ha añadido el macro _PRINTF_NAN_LEN_MAX, propuesto en el borrador del estándar ISO C2X.
- En las funciones de la familia printf se han añadido los especificadores de formato "%b" y "%B" para la salida de números enteros en representación binaria.
- En el sistema de enlace dinámico se ha implementado un nuevo algoritmo de ordenación DSO, que utiliza el método de búsqueda en profundidad (DFS) para resolver problemas de rendimiento al manejar dependencias cíclicas. Se ha propuesto el parámetro glibc.rtld.dynamic_sort para elegir el algoritmo de ordenación DSO, al que se le puede asignar el valor "1" para retroceder al algoritmo anterior.
- Se ha añadido soporte en ABI para la nueva función '__memcmpeq', utilizada por los compiladores para optimizar el uso de 'memcmp', en los casos donde el valor devuelto por esta función se utiliza solo para verificar el estado de finalización de la operación.
- Se ha añadido soporte para el registro automático de hilos utilizando la llamada al sistema rseq (secuencias reiniciables), disponible a partir del núcleo de Linux 4.18. La llamada al sistema rseq permite organizar la ejecución ininterrumpida de un grupo de instrucciones, no interrumpidas y que confirmen el resultado de la última instrucción en el grupo. En esencia, se proporciona un medio para llevar a cabo operaciones atómicas muy rápidas que, en caso de ser interrumpidas por otro hilo, se limpian y se intenta ejecutar de nuevo.
- Se ha añadido un enlace simbólico /usr/bin/ld.so.
- Se ha garantizado la compilación por defecto de todos los archivos ejecutables de programas integrados y conjuntos de pruebas en modo PIE (ejecutable independiente de la posición). Para desactivar este comportamiento, se ha previsto la opción '--disable-default-pie'.
- Para Linux, se ha añadido la configuración glibc.malloc.hugetlb, que permite cambiar la implementación de malloc para usar la llamada al sistema madvise con la bandera MADV_HUGEPAGE para mmap y sbrk, o utilizar directamente grandes páginas de memoria al especificar la bandera MAP_HUGETLB en las llamadas a mmap. En el primer caso, se puede lograr un aumento en el rendimiento si las Transparent Huge Pages se utilizan en modo madvise, y en el segundo, se permite el uso de grandes páginas reservadas por el sistema (Huge Pages).
- Se ha añadido la función _dl_find_object, que se puede utilizar para añadir información sobre el desmantelamiento de la pila de llamadas (unwind).
- Se ha añadido soporte para la arquitectura OpenRISC (or1k-linux-gnu) en modo de procesamiento software de operaciones de punto flotante (soft-float). Para que el puerto funcione, se requiere binutils 2.35, GCC 11, y el núcleo de Linux 5.4.
- Se ha añadido un flag de compilación '--with-rtld-early-cflags', con el que se pueden especificar flags adicionales de compilación utilizados al compilar el código inicial para el enlace dinámico.
- Para la plataforma Linux, se ha añadido la función epoll_pwait2, que se diferencia de epoll_wait al especificar un tiempo de espera con precisión en nanosegundos.
- Se ha añadido la función posix_spawn_file_actions_addtcsetpgrp_np, que excluye condiciones de carrera al establecer el terminal de control para un nuevo proceso.
- Para aplicaciones compiladas con Glibc y GCC 12+, se ha implementado el modo de protección «_FORTIFY_SOURCE=3», que detecta posibles desbordamientos de búfer al ejecutar funciones de cadena definidas en el archivo de encabezado string.h. La diferencia con el modo «_FORTIFY_SOURCE=2» se reduce a verificaciones adicionales que pueden reducir el rendimiento.
- Se ha descontinuado el soporte para las extensiones de Intel MPX (Memory Protection Extensions), utilizadas para verificar punteros en relación con los límites de las áreas de memoria (esta tecnología no tuvo expansión y ya ha sido eliminada de GCC y LLVM).
- Se ha declarado obsoleto y será eliminado en la próxima versión el mecanismo prelink y las variables de entorno asociadas LD_TRACE_PRELINKING y LD_USE_LOAD_BIAS.
Se han corregido vulnerabilidades:
- CVE-2022-23218, CVE-2022-23219 — desbordamiento de búfer en las funciones svcunix_create y clnt_create, causado por la copia en la pila del contenido de un parámetro llamado archivo sin verificar el tamaño de los datos copiados. Para las aplicaciones compiladas sin protección de pila y que utilizan el protocolo «unix», la vulnerabilidad puede permitir la ejecución de código malicioso al procesar nombres de archivo muy largos.
- CVE-2021-3998 — vulnerabilidad en la función realpath(), causada por devolver en ciertas condiciones un valor incorrecto que contiene datos residuales no limpiados de la pila. Para el programa SUID-root fusermount, la vulnerabilidad puede ser utilizada para obtener información confidencial de la memoria del proceso, como información sobre punteros.
- CVE-2021-3999 — desbordamiento de búfer de un byte en la función getcwd(). El problema se debe a un error que ha estado presente desde 1995. Para provocar el desbordamiento, es suficiente realizar una llamada a chdir() al directorio «/» en un espacio de nombres separado de puntos de montaje.
Fuente: opennet.ru
