После шести месяцев разработки опубликован релиз системной библиотеки GNU C Library (glibc) 2.35, которая полностью следует требованиям стандартов ISO C11 и POSIX.1-2017. В состав нового выпуска включены исправления от 66 разработчиков.
Из реализованных в Glibc 2.35 улучшений можно отметить:
- Добавлена поддержка локали “C.UTF-8”, включающей правила сортировки для всех Unicode-кодов, но для экономии места ограниченной использованием ASCII-диапазонов в функциях fnmatch, regexec и regcomp. Локаль занимает около 400 КБ, из которых 346 КБ составляют данные LC_CTYPE для Unicode, и требует отдельной установки (не встроена в Glibc).
- Данные кодировок, информация о типах символов и таблицы транслитерации обновлены для поддержки спецификации Unicode 14.0.0.
- В и реализованы функции и макросы, округляющие результат до более узкого типа: fsqrt, fsqrtl, dsqrtl, ffma, ffmal, dfmal, fMsqrtfN, fMsqrtfNx, fMxsqrtfN, fMxsqrtfNx, fMfmafN, fMfmafNx, fMxfmafN и fMxfmafNx. Функции описаны в спецификациях TS 18661-1:2014, TS 18661-3:2015 и добавлены в черновик будущего Си-стандарта ISO C2X.
- В и реализованы функции и макросы для нахождения минимума и максимума чисел с плавающей запятой с типами float, long double, _FloatN и _FloatNx, описанные в спецификации IEEE 754-2019 и добавленные в черновик будущего Си-стандарта ISO C2X: fmaximum, fmaximum_num, fmaximum_mag, fmaximum_mag_num, fminimum, fminimum_num, fminimum_mag, fminimum_mag_num.
- В добавлены константы для чисел с плавающей запятой одинарной точности: 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 и M_SQRT1_2f.
- Для функций exp10 в заголовочный файл добавлены соответствующие макроcы, не привязанные к конкретным типам.
- В добавлен макрос _PRINTF_NAN_LEN_MAX, предложенный в черновике стандарта ISO C2X.
- В функции семейства printf добавлены спецификаторы формата “%b” и “%B” для вывода целых чисел в двоичном представлении.
- В системе динамического связывания реализован новый алгоритм сортировки DSO, использующий метод поиска в глубину (DFS) для решения проблем с производительностью при обработке зацикленных зависимостей. Для выбора алгоритма сортировки DSO предложен параметр glibc.rtld.dynamic_sort, которому можно присвоить значение “1” для отката на старый алгоритм.
- В ABI добавлена поддержка новой функции ‘__memcmpeq’, применяемой компиляторами для оптимизации использования ‘memcmp’, в случае если возвращаемое данной функцией значение используется только для проверки статуса завершения операции.
- Добавлена поддержка автоматической регистрации потоков, используя системный вызов rseq (restartable sequences), предоставляемый начиная с ядра Linux 4.18. Системный вызов rseq позволяет организовать неразрывное выполнение группы инструкций, не прерываемой и подтверждающей результат последней инструкцией в группе. По сути предоставляется средство для очень быстрого атомарного выполнения операций, которые в случае прерывания другим потоком очищаются и предпринимается повторная попытка выполнения.
- Добавлена символическая ссылка /usr/bin/ld.so.
- Обеспечена сборка по умолчанию всех исполняемых файлов встроенных программ и тестового набора в режиме PIE (position independent executable).
Для отключения данного поведения предусмотрена опция “–disable-default-pie”. - Для Linux добавлена настройка glibc.malloc.hugetlb, позволяющая переключить реализацию malloc на использование системного вызова madvise с флагом MADV_HUGEPAGE для mmap и sbrk или напрямую использовать большие страницы памяти через указание флага MAP_HUGETLB в вызовах mmap. В первом случае можно добиться увеличения производительности, если Transparent Huge Pages используются в режиме madvise, а во втором предоставляется возможность использования зарезервированных системой больших страниц (Huge Pages).
- Добавлена функция _dl_find_object, которую можно использовать для добавления информации о раскрутке стека вызовов (unwind).
- Добавлена поддержка архитектуры OpenRISC (or1k-linux-gnu) в режиме программной обработки операций с плавающей запятой (soft-float). Для работы порта требуется binutils 2.35, GCC 11, и ядро Linux 5.4.
- Добавлен сборочный флаг “–with-rtld-early-cflags”, при помощи которого можно указать дополнительные флаги компиляции, используемые при сборке начального кода для динамического связывания.
- Для платформы Linux добавлена функция epoll_pwait2, отличающаяся от epoll_wait указанием таймаута с наносекундной точностью.
- Добавлена функция posix_spawn_file_actions_addtcsetpgrp_np, исключающая состояния гонки при установке управляющего терминала для нового процесса.
- Для приложений, компилируемых с Glibc и GCC 12+, реализован режим защиты “_FORTIFY_SOURCE=3”, выявляющий возможные переполнения буфера при выполнении строковых функций, определённых в заголовочном файле string.h. Отличие от режима “_FORTIFY_SOURCE=2” сводится к дополнительным проверкам, которые потенциально могут приводить к снижению производительности.
- Прекращена поддержка расширений Intel MPX (Memory Protection Extensions), используемых для проверки указателей на соблюдение границ областей памяти (указанная технология не получила распространения и уже удалена из GCC и LLVM).
- Объявлен устаревшим и будет удалён в следующем выпуске механизм prelink и связанные с ним переменные окружения LD_TRACE_PRELINKING и LD_USE_LOAD_BIAS.
Устранены уязвимости:
- CVE-2022-23218, CVE-2022-23219 – переполнение буфера в функциях svcunix_create и clnt_create, вызванное копированием в стек содержимого параметра с именем файла без проверки размера копируемых данных. Для приложений, собранных без защиты стека и использующих протокол “unix”, уязвимость может привести к организации выполнения кода злоумышленника при обработке очень длинных имён файлов.
- CVE-2021-3998 – уязвимость в функции realpath(), вызванная возвращением при определённых условиях некорректного значения, содержащего неочищенные остаточные данные из стека. Для SUID-root программы fusermount уязвимость можно использовать для получения конфиденциальных сведений из памяти процесса, например, для получения сведений об указателях.
- CVE-2021-3999 – однобайтовое переполнение буфера в функции getcwd(). Проблема вызвана ошибкой, присутствующей с 1995 года. Для вызова переполнения достаточно в отдельном пространстве имён точек монтирования выполнить вызов chdir() для каталога “/”.
Release.
Ссылка here.