Wydanie biblioteki systemowej Glibc 2.35

Po sześciu miesiącach prac wydano bibliotekę systemową GNU C Library (glibc) 2.35, która jest w pełni zgodna z wymaganiami standardów ISO C11 i POSIX.1-2017. Nowa wersja zawiera poprawki od 66 programistów.

Niektóre ulepszenia wprowadzone w Glibc 2.35 obejmują:

  • Dodano obsługę ustawień regionalnych „C.UTF-8”, która obejmuje reguły sortowania dla wszystkich kodów Unicode, ale w celu zaoszczędzenia miejsca ogranicza się do użycia zakresów ASCII w funkcjach fnmatch, regexec i regcomp. Ustawienia regionalne zajmują około 400 KB, z czego 346 KB to dane LC_CTYPE dla Unicode i wymagają osobnej instalacji (nie wbudowanej w Glibc).
  • Dane kodowania, informacje o typach znaków i tabele transliteracji zostały zaktualizowane, aby obsługiwały specyfikację Unicode 14.0.0.
  • W I implementowane są funkcje i makra, które zaokrąglają wynik do węższego typu: fsqrt, fsqrtl, dsqrtl, ffma, ffmal, dfmal, fMsqrtfN, fMsqrtfNx, fMxsqrtfN, fMxsqrtfNx, fMfmafN, fMfmafNx, fMxfmafN i fMxfmafNx. Funkcje opisano w specyfikacjach TS 18661-1:2014, TS 18661-3:2015 i dodano do projektu przyszłej normy ISO C2X C.
  • W I zaimplementowano funkcje i makra do znajdowania minimum i maksimum liczb zmiennoprzecinkowych typu float, long double, _FloatN i _FloatNx, opisane w specyfikacji IEEE 754-2019 i dodane do projektu przyszłej normy ISO C2X C: fmaximum, fmaximum_num , fmaximum_mag, fmaximum_mag_num, fminimum, fminimum_num, fminimum_mag, fminimum_mag_num.
  • W dodano stałe dla liczb zmiennoprzecinkowych pojedynczej precyzji: 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 i M_SQRT1_2f.
  • Dla funkcji exp10 w pliku nagłówkowym Dodano odpowiednie makra, które nie są powiązane z konkretnymi typami.
  • W dodano makro _PRINTF_NAN_LEN_MAX zaproponowane w projekcie normy ISO C2X.
  • Do rodziny funkcji printf dodano specyfikatory formatu „%b” i „%B”, umożliwiające drukowanie liczb całkowitych w reprezentacji binarnej.
  • System dynamicznego łączenia implementuje nowy algorytm sortowania DSO, który wykorzystuje przeszukiwanie w głąb (DFS) w celu rozwiązania problemów z wydajnością podczas obsługi zapętlonych zależności. Aby wybrać algorytm sortowania DSO, proponowany jest parametr glibc.rtld.dynamic_sort, który można ustawić na „1”, aby przywrócić stary algorytm.
  • ABI dodało obsługę nowej funkcji „__memcmpeq”, używanej przez kompilatory do optymalizacji użycia „memcmp”, jeśli wartość zwrócona przez tę funkcję służy tylko do sprawdzenia stanu zakończenia operacji.
  • Dodano obsługę automatycznego rejestrowania wątków przy użyciu wywołania systemowego rseq (sekwencje do ponownego uruchomienia) dostępnego od jądra Linuksa 4.18. Wywołanie systemowe rseq pozwala zorganizować ciągłe wykonywanie grupy instrukcji, które nie jest przerywane i potwierdza wynik ostatnią instrukcją w grupie. Zasadniczo zapewnia możliwość bardzo szybkiego, atomowego wykonywania operacji, które w przypadku przerwania przez inny wątek są czyszczone i podejmowane ponownie.
  • Dodano dowiązanie symboliczne /usr/bin/ld.so.
  • Zapewniony jest domyślny zestaw wszystkich plików wykonywalnych programów osadzonych i zestawu testowego w trybie PIE (plik wykonywalny niezależny od pozycji). Aby wyłączyć to zachowanie, dostępna jest opcja „--disable-default-pie”.
  • W systemie Linux dodano ustawienie glibc.malloc.hugetlb umożliwiające przełączenie implementacji malloc w celu korzystania z wywołania systemowego madvise z flagą MADV_HUGEPAGE dla mmap i sbrk lub bezpośredniego korzystania z dużych stron pamięci poprzez określenie flagi MAP_HUGETLB w mmap dzwoni. W pierwszym przypadku wzrost wydajności można osiągnąć, jeśli używa się Transparent Huge Pages w trybie madvise, a w drugim przypadku zapewniona jest możliwość korzystania z zarezerwowanych przez system Huge Pages.
  • Dodano funkcję _dl_find_object, której można użyć do dodania informacji o rozwinięciu stosu wywołań.
  • Dodano obsługę architektury OpenRISC (lub1k-linux-gnu) w trybie soft-float. Port wymaga binutils 2.35, GCC 11 i jądra Linux 5.4.
  • Dodano flagę kompilacji „--with-rtld-early-cflags”, której można użyć do określenia dodatkowych flag kompilacji używanych podczas budowania początkowego kodu do dynamicznego łączenia.
  • Dla platformy Linux dodano funkcję epoll_pwait2, która różni się od epoll_wait określeniem limitu czasu z dokładnością do nanosekund.
  • Dodano funkcję posix_spawn_file_actions_addtcsetpgrp_np, aby wyeliminować warunki wyścigu podczas ustawiania terminala sterującego dla nowego procesu.
  • Dla aplikacji skompilowanych z Glibc i GCC 12+ zaimplementowany jest tryb ochrony „_FORTIFY_SOURCE=3”, który wykrywa możliwe przepełnienia bufora podczas wykonywania funkcji łańcuchowych zdefiniowanych w pliku nagłówkowym string.h. Różnica w stosunku do trybu „_FORTIFY_SOURCE=2” sprowadza się do dodatkowych kontroli, które mogą potencjalnie prowadzić do zmniejszenia wydajności.
  • Zakończono obsługę Intel MPX (Memory Protection Extensions), służącego do sprawdzania wskaźników pod kątem ograniczeń pamięci (technologia ta nie rozpowszechniła się i została już usunięta z GCC i LLVM).
  • Mechanizm wstępnego łączenia i powiązane z nim zmienne środowiskowe LD_TRACE_PRELINKING i LD_USE_LOAD_BIAS są przestarzałe i zostaną usunięte w przyszłej wersji.

    Naprawiono luki:

    • CVE-2022-23218, CVE-2022-23219 – Przepełnienie bufora w funkcjach svcunix_create i clnt_create spowodowane skopiowaniem zawartości parametru filename na stos bez sprawdzenia rozmiaru kopiowanych danych. W przypadku aplikacji zbudowanych bez ochrony stosu i korzystających z protokołu „unix” luka może doprowadzić do wykonania kodu atakującego podczas przetwarzania bardzo długich nazw plików.
    • CVE-2021-3998 to luka w funkcji realpath() polegająca na zwróceniu, pod pewnymi warunkami, nieprawidłowej wartości zawierającej nieoczyszczone resztkowe dane ze stosu. W przypadku programu utrwalacza SUID-root luka może zostać wykorzystana do uzyskania poufnych informacji z pamięci procesu, na przykład w celu uzyskania informacji o wskaźnikach.
    • CVE-2021-3999 – Przepełnienie bufora jednobajtowego w funkcji getcwd(). Problem jest spowodowany błędem występującym od 1995 roku. Aby spowodować przepełnienie, po prostu wywołaj funkcję chdir() w katalogu „/” w osobnej przestrzeni nazw punktu podłączenia.

    Źródło: opennet.ru

Dodaj komentarz