Выпуск системной библиотеки Glibc 2.35

После шести месяцев разработки опубликован релиз системной библиотеки 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.
  • В <math.h> и <tgmath.h> реализованы функции и макросы, округляющие результат до более узкого типа: fsqrt, fsqrtl, dsqrtl, ffma, ffmal, dfmal, fMsqrtfN, fMsqrtfNx, fMxsqrtfN, fMxsqrtfNx, fMfmafN, fMfmafNx, fMxfmafN и fMxfmafNx. Функции описаны в спецификациях TS 18661-1:2014, TS 18661-3:2015 и добавлены в черновик будущего Си-стандарта ISO C2X.
  • В <math.h> и <tgmath.h> реализованы функции и макросы для нахождения минимума и максимума чисел с плавающей запятой с типами 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.
  • В <math.h> добавлены константы для чисел с плавающей запятой одинарной точности: 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 в заголовочный файл <tgmath.h> добавлены соответствующие макроcы, не привязанные к конкретным типам.
  • В <stdio.h> добавлен макрос _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() для каталога «/».

    Источник: opennet.ru

Добавить комментарий