Після шести місяців розробки опубліковано реліз системної бібліотеки GNU C Library (glibc) 2.34, яка повністю дотримується вимог стандартів ISO C11 та POSIX.1-2017. До складу нового випуску включено виправлення від 66 розробників.
З реалізованих у Glibc 2.34 покращень можна відзначити:
- В основний склад libc інтегровані бібліотеки libpthread, libdl, libutil та libanl, використання функціональності яких у додатках відтепер не вимагає зв'язування за допомогою прапорів -lpthread, -ldl, -lutil та -lanl. Проведено підготовку до інтеграції libresolv в libc. Інтеграція дозволить досягти цілісного процесу оновлення glibc і спростить реалізацію runtime. Для забезпечення зворотної сумісності з програмами, зібраними зі старими версіями glibc, надані бібліотеки-заглушки. Через розширення числа структур і функцій, що надаються в glibc, не виключена поява проблем у додатках, в яких спостерігається перетин імен з раніше не використаними бібліотеками libpthread, libdl, libutil, libresolv і libanl.
- Надано можливість використання 64-розрядного типу time_t у конфігураціях, у яких традиційно використовувався 32-розрядний тип time_t. У подібних конфігураціях, наприклад, на системах x86, за умовчанням поки залишається 32-розрядний time_t, але цю поведінку тепер можна змінити макросом «_TIME_BITS». Можливість доступна лише на системах із ядром Linux як мінімум версії 5.1.
- Додано функцій _Fork, заміна функції fork, що відповідає вимогам "async-signal-safe", тобто. що допускає безпечний виклик із оброблювачів сигналів. У процесі виконання _Fork формується мінімальне оточення, достатнє для виклику функцій в обробниках сигналів, таких як raise і execve, без використання можливостей, які можуть призвести до зміни блокувань або внутрішнього стану. Виклик _Fork буде визначений у майбутній версії стандарту POSIX, але поки що включений до числа розширень GNU.
- Для платформи Linux реалізована функція execveat, що дозволяє запустити файл, що виконується з відкритого файлового дескриптора. Нова функція також використовується в реалізації виклику fexecve, що не вимагає при запуску наявності примонтованої псевдо-ФС /proc.
- Додано функцію timespec_getres, визначену в чернетці стандарту ISO C2X і доповнює функцію timespec_get можливостями, схожими на POSIX-функцію clock_getres.
- Додано функцію close_range(), що дозволяє процесу разом закрити цілий діапазон відкритих файлових дескрипторів. Функція доступна на системах з ядром Linux як мінімум версії 5.9.
- Додані функції closefrom і posix_spawn_file_actions_addclosefrom_np, що дозволяють закрити разом усі файлові дескриптори, номер яких більший або дорівнює вказаному значенню.
- У режимах _DYNAMIC_STACK_SIZE_SOURCE і _GNU_SOURCE значення PTHREAD_STACK_MIN, MINSIGSTKSZ і SIGSTKSZ тепер не є константами, що дозволяє забезпечити підтримку наборів регістрів динамічного розміру, наприклад, що надаються в розширенні ARM SVE.
- У компонувальнику реалізована опція «list-diagnostics» для виведення інформації, пов'язаної з операціями визначення IFUNC (indirect function) і вибору підкаталогу glibc-hwcaps.
- Реалізовано макрос __STDC_WANT_IEC_60559_EXT__, призначений для перевірки наявності функцій, визначених у додатку "F" специфікації ISO C2X.
- Для систем powerpc64* реалізована опція «disable-scv», що дозволяє зібрати glibc без підтримки інструкції scv.
- У файлі gconv-modules залишено лише мінімальний набір основних модулів gconv, а інші переміщені у додатковий файл gconv-modules-extra.conf, розміщений у каталозі gconv-modules.d.
- Для платформи Linux реалізовано параметр glibc.pthread.stack_cache_size, який можна використовувати для налаштування розміру кеша стека pthread.
- Оголошена застаріла функція inet_neta із заголовного файлу , а також різні функції, що рідко застосовуються з (dn_count_labels, fp_nquery, fp_query, fp_resstat, hostalias, loc_aton, loc_ntoa, pc, p_fqnname, p_option, p_query, p_rcode, p_time, p_type, putlong, putshort, res_hostalias, res_isourserver, res_nameinquery, res_queriesmatch, res_randomid, sym_ntop, sym_ntos, sym_ston) і <arpa/name kecanon, ns_parse_ttl, ns_samedomain , ns_samename, ns_sprintrr, ns_sprintrrf, ns_subdomain). Замість цих функцій рекомендовано використовувати окремі бібліотеки для роботи з DNS.
- Оголошені застарілими функції pthread_mutex_consistent_np, thread_mutexattr_getrobust_np, pthread_mutexattr_setrobust_np та pthread_yield замість яких слід використовувати pthread_mutex_consistent, thread_mutexattr_getrobust, hread_mutexattr.
- Припинено використання символічних посилань для прив'язки об'єктів, що встановлюються, до версії Glibc. Подібні об'єкти тепер встановлюються як є (наприклад, libc.so.6 є файлом, а не посиланням на libc-2.34.so).
- За замовчуванням відключені можливості налагодження в malloc, такі як MALLOC_CHECK_ (glibc.malloc.check), mtrace() і mcheck(), які винесені в окрему бібліотеку libc_malloc_debug.so, в яку також переміщені застарілі функції malloc_get_state
- У Linux для роботи функцій, подібних до shm_open і sem_open, тепер потрібна наявність пристрою /dev/shm.
- Усунені вразливості:
- CVE-2021-27645: крах процесу nscd (nameserver caching daemon) через подвійний виклик функції free при обробці спеціально оформлених netgroup-запитів.
- CVE-2021-33574: звернення до звільненої області пам'яті (use-after-free) у функції mq_notify при використанні типу сповіщень SIGEV_THREAD з атрибутом потоку, для якого виставлена альтернативна маска прив'язки до CPU. Проблема може призвести до краху, але не виключаються інші варіанти атак.
- CVE-2021-35942: переповнення розміру параметра у функції wordexp може призвести до краху програми.
Джерело: opennet.ru