След шестмесечно развитие, е публикувана версия на системната библиотека 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 (непряка функция) и избор на подкаталог 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, p_cdname, p_cdnname, p_class, p_fqname, 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) и (ns_datetosecs, ns_format_ttl, ns_makecanon, 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, thread_mutexattr_setrobust и sched_yield.
- Прекратено използването на символични линкове за свързване на инсталираните споделени обекти с версията на Glibc. Подобни обекти сега се инсталират както са (например, libc.so.6 вече е файл, а не линк към libc-2.34.so).
- По подразбиране са деактивирани дебъгинг функционалности в malloc, като MALLOC_CHECK_ (glibc.malloc.check), mtrace() и mcheck(), които са прехвърлени в отделна библиотека libc_malloc_debug.so, в която също са преместени остарелите функции malloc_get_state и malloc_set_state.
- В Linux за работата на функции като shm_open и sem_open сега изисква наличието на устройство /dev/shm.
- Устранени уязвимости:
- CVE-2021-27645: срив на процеса nscd (демон за кеширане на имената на сървъри) поради двойно извикване на функцията free при обработка на специално оформени netgroup заявки.
- CVE-2021-33574: достъп до вече освободена област от памет (use-after-free) в функцията mq_notify при използване на тип уведомления SIGEV_THREAD с атрибут на поток, за който е зададена алтернативна маска за привързване към CPU. Проблемът може да доведе до срив, но не се изключват и други варианти на атаки.
- CVE-2021-35942: препълването на размера на параметъра в функцията wordexp може да доведе до срив на приложението.
Източник: opennet.ru
