Выпуск системной библиотеки 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. Системный вызов позволяет организовать неразрывное выполнение группы инструкций, не прерываемой и подтверждающей результат последней инструкцией в группе. По сути предоставляется средство для очень быстрого атомарного выполнения операций, которые в случае прерывания другим потоком очищаются и предпринимается повторная попытка выполнения.

  • Добавлена символическая ссылка /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. Currently only soft-float.

  • Добавлен сборочный флаг »--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 () для каталога »/».



    Источник: http://www.opennet.ru/opennews/art.shtml? num=56631

© OpenNet