Издаване на системната библиотека Glibc 2.31

След шестмесечно разработване беше публикуван релиз на системната библиотека GNU C Library (glibc) 2.31, която напълно отговаря на стандартите ISO C11 и POSIX.1-2008. В новата версия са включени поправки от 58 разработчици.

От реализациите в Glibc 2.31 подобрения може да се отбележи:

  • Добавен е макрос _ISOC2X_SOURCE за включване на възможности, определени в черновата на бъдещия стандарт ISO C2X. Тези възможности също се включват, когато се използва макросът _GNU_SOURCE или при компилиране в gcc с флага «-std=gnu2x»;
  • За функциите, определени в заглавния файл «math.h», които закръгляват резултатите си до по-малък тип, в файла «tgmath.h» са предложени съответните макроси за обобщен тип, както изискват спецификациите TS 18661-1:2014 и TS 18661-3:2015;
  • Добавена е функцията pthread_clockjoin_np(), която очаква завършването на нишка с оглед на тайм-аут (ако тайм-аутът настъпи преди завършването, функцията ще върне грешка). За разлика от pthread_timedjoin_np(), в pthread_clockjoin_np() е позволено определянето на типа таймер за изчисляване на тайм-аута — CLOCK_MONOTONIC (включва времето, прекарано от системата в спящ режим) или CLOCK_REALTIME;
  • В DNS резолвера е добавена поддръжка на опцията trust-ad в /etc/resolv.conf и флага RES_TRUSTAD в _res.options, при активацията на които в DNS запитванията се предава DNSSEC флагът AD (authenticated data). В този режим, зададеният от сървъра AD флаг става достъпен за приложенията, които извикват функции, подобни на res_search(). По подразбиране, ако предложените опции не са активирани, glibc не указва AD флага в запитвания и автоматично го изчиства в отговори, което показва отсъствието на DNSSEC проверка;
  • За изграждане на работещи обвивки на системните повиквания за Glibc вече не е необходимо инсталиране на заглавните файлове на ядро Linux. Изключение прави 64-битовата архитектура RISC-V;
  • Отстранен уязвимост CVE-2019-19126, която позволява заобикаляне на защита
    ASLR в програми с флага setuid и определяне на разпределението на адресите в зарежданите библиотеки чрез манипулация с променливата на средата LD_PREFER_MAP_32BIT_EXEC.

Промени, нарушаващи съвместимостта:

  • В totalorder(), totalordermag() и подобни функции за други типове с плаваща запетая сега приемат като аргумент указатели, за да се избегнат предупреждения за преобразуване на стойности в състояние NaN, в съответствие с препоръките на TS 18661-1, предложени за бъдещия стандарт C2X.
    Съществуващите изпълними файлове, в които аргументите с плаваща запетая се предават директно, ще продължат да работят без промяна;
  • Отдавна обявената остаряла функция stime вече е недостъпна за свързани с glibc бинарни файлове, а нейното определение е премахнато от time.h. За задаване на системното време следва да се използва функцията clock_settime. В бъдеще се планира да бъде премахната и помечената като остаряла функция ftime, както и заглавният файл sys/timeb.h (вместо ftime следва да се използва gettimeofday или clock_gettime);
  • Функцията gettimeofday вече не предава информация за общосистемния часови пояс (тази възможност беше актуална по времената на 4.2-BSD и от много години е обявена за остаряла). В аргумента 'tzp' сега следва да се предава нулев указател, а за получаване на информация за часовия пояс, свързан с текущото време, да се използва функцията localtime(). При извикване на gettimeofday с ненулев аргумент 'tzp' ще се върнат празни полета tz_minuteswest и tz_dsttime в структурата timezone. Самата функция gettimeofday се считат за остаряла в POSIX (вместо gettimeofday се препоръчва да се използва clock_gettime), но не се планира да бъде премахната от glibc;
  • В settimeofday е спряна поддръжката за едновременна предаване на параметри за задаване на време и коригиращо времето изместване. При извикване на settimeofday един от аргументите (време или изместване) сега задължително трябва да бъде зададен на null, в противен случай извикването на функцията ще завърши с грешка EINVAL. Както gettimeofday, функцията settimeofday също се смята за остаряла в POSIX и вместо нея се препоръчва да се използват функцията clock_settime или семейството функции adjtime;
  • Спирането на поддръжката за архитектурата SPARC ISA v7 (поддръжката на v8 все още е запазена, но само за процесори с поддръжка на команди CAS, като например процесорите LEON, но не и процесорите SuperSPARC).
  • В случай на провал на свързването в режим „lazy“, при което компоновчикът не извършва търсене на символите от функцията до първото й извикване, функцията dlopen сега принудително приключва изпълнението на процеса (по-рано при провал се връщаше NULL);
  • За ABI MIPS hard-float сега се използва изпълним стек, освен ако при компилиране явно не е зададено ограничение за използване на ядрото Linux 4.8+ чрез параметъра „--enable-kernel=4.8.0“ (с ядра до 4.8 се наблюдават провали за някои конфигурации MIPS);
  • Обвързванията над системни повиквания, свързани с манипулацията на времето, са преместени на използването на системно повикване time64, когато е налично (в 32-битови системи glibc първо се опитва да използва новите системни повиквания, манипулиращи 64-битови типове за време, а ако ги няма, пада обратно на старите 32-битови повиквания).

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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster