پس از شش ماه توسعه، کتابخانه سیستمی GNU C Library (glibc) 2.35 منتشر شد که به طور کامل با الزامات استانداردهای ISO C11 و POSIX.1-2017 مطابقت دارد. نسخه جدید شامل اصلاحاتی از 66 توسعه دهنده است.
برخی از بهبودهای اجرا شده در Glibc 2.35 عبارتند از:
- پشتیبانی از محلی "C.UTF-8" اضافه شده است، که شامل قوانین ترکیب بندی برای همه کدهای یونیکد است، اما برای صرفه جویی در فضا به استفاده از محدوده های ASCII در توابع fnmatch، regexec و regcomp محدود شده است. محلی حدود 400 کیلوبایت است که 346 کیلوبایت آن داده LC_CTYPE برای یونیکد است و نیاز به نصب جداگانه دارد (که در Glibc تعبیه نشده است).
- دادههای رمزگذاری، اطلاعات نوع کاراکتر و جداول نویسهگردانی برای پشتیبانی از مشخصات Unicode 14.0.0 بهروزرسانی شدهاند.
- که در و توابع و ماکروها پیاده سازی می شوند که نتیجه را به یک نوع باریک تر تبدیل می کنند: fsqrt, fsqrtl, dsqrtl, ffma, ffmal, dfmal, fMsqrtfN, fMsqrtfNx, fMxsqrtfN, fMxsqrtfNx, fMfmafN, fMf, fMfmafNx, fMfMxf, fMfmafNx, fMf. عملکردها در مشخصات TS 18661-1:2014، TS 18661-3:2015 شرح داده شده و به پیش نویس استاندارد ISO C2X C آینده اضافه شده است.
- که در و توابع و ماکروهای پیاده سازی شده برای یافتن حداقل و حداکثر اعداد ممیز شناور با انواع float، long double، _FloatN و _FloatNx که در مشخصات IEEE 754-2019 شرح داده شده و به پیش نویس استاندارد ISO C2X C آینده اضافه شده است: fmaximum، fmaximum_num. ، fmaximum_mag، fmaximum_mag_num، fminimum، fminimum_num، fminimum_mag، fminimum_mag_num.
- که در ثابتهای اضافه شده برای اعداد ممیز شناور دقیق: 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_SQRTQQRTPIf2، M_1_SQRTQQS2، M_XNUMX_SQRTPIf.
- برای توابع exp10 در فایل هدر ماکروهای متناظر اضافه شده که به انواع خاصی وابسته نیستند.
- که در ماکرو _PRINTF_NAN_LEN_MAX پیشنهاد شده در پیش نویس استاندارد ISO C2X را اضافه کرد.
- برای چاپ اعداد صحیح در نمایش باینری، مشخصکنندههای قالب «%b» و «%B» به خانواده توابع printf اضافه شد.
- سیستم پیوند پویا یک الگوریتم مرتبسازی DSO جدید را پیادهسازی میکند که از جستجوی عمقی (DFS) برای رسیدگی به مشکلات عملکرد هنگام مدیریت وابستگیهای حلقهای استفاده میکند. برای انتخاب الگوریتم مرتبسازی DSO، پارامتر glibc.rtld.dynamic_sort پیشنهاد میشود که میتوان آن را روی "1" تنظیم کرد تا به الگوریتم قدیمی برگردد.
- ABI برای یک تابع جدید "__memcmpeq" پشتیبانی اضافه کرده است که توسط کامپایلرها برای بهینه سازی استفاده از "memcmp" در صورتی که مقدار بازگردانده شده توسط این تابع فقط برای بررسی وضعیت تکمیل یک عملیات استفاده شود، استفاده می کند.
- اضافه شدن پشتیبانی برای ثبت خودکار موضوعات با استفاده از فراخوانی سیستم rseq (توالی های قابل راه اندازی مجدد) که از هسته لینوکس 4.18 ارائه شده است. فراخوانی سیستم rseq به شما این امکان را می دهد که اجرای مداوم گروهی از دستورالعمل ها را سازماندهی کنید که قطع نمی شود و نتیجه را با آخرین دستور در گروه تأیید می کند. اساساً وسیلهای برای اجرای اتمی بسیار سریع عملیاتی فراهم میکند که در صورت قطع شدن توسط نخ دیگری، پاکسازی شده و دوباره تلاش میشود.
- Symlink /usr/bin/ld.so اضافه شد.
- اسمبلی پیش فرض تمامی فایل های اجرایی برنامه های تعبیه شده و مجموعه تست در حالت PIE (قابل اجرا مستقل از موقعیت) ارائه شده است. برای غیرفعال کردن این رفتار، گزینه "--disable-default-pie" ارائه شده است.
- برای لینوکس، یک تنظیم glibc.malloc.hugetlb اضافه شده است تا اجرای malloc را برای استفاده از فراخوانی سیستم madvise با پرچم MADV_HUGEPAGE برای mmap و sbrk یا استفاده مستقیم از صفحات حافظه بزرگ با مشخص کردن پرچم MAP_HUGETLB در mmap تغییر دهد. تماس می گیرد. در حالت اول در صورت استفاده از Transparent Huge Pages در حالت madvise می توان به دستاوردهای عملکردی دست یافت و در حالت دوم امکان استفاده از Huge Pages رزرو شده توسط سیستم فراهم می شود.
- تابع _dl_find_object اضافه شد که می تواند برای افزودن اطلاعات باز کردن پشته تماس استفاده شود.
- پشتیبانی از معماری OpenRISC (or1k-linux-gnu) در حالت soft-float اضافه شده است. این پورت به binutils 2.35، GCC 11 و Linux kernel 5.4 نیاز دارد.
- یک پرچم ساخت "--with-rtld-early-cflags" اضافه شد، که می تواند برای مشخص کردن پرچم های کامپایل اضافی مورد استفاده در هنگام ساخت کد اولیه برای پیوندهای پویا استفاده شود.
- برای پلتفرم لینوکس، تابع epoll_pwait2 اضافه شده است که با مشخص کردن یک بازه زمانی با دقت نانوثانیه، با epoll_wait متفاوت است.
- تابع posix_spawn_file_actions_addtcsetpgrp_np برای حذف شرایط مسابقه هنگام تنظیم یک ترمینال کنترل برای یک فرآیند جدید اضافه شده است.
- برای برنامه های کامپایل شده با Glibc و GCC 12+، حالت حفاظتی "_FORTIFY_SOURCE=3" اجرا می شود که سرریزهای احتمالی بافر را هنگام اجرای توابع رشته تعریف شده در فایل هدر string.h شناسایی می کند. تفاوت از حالت "_FORTIFY_SOURCE=2" به بررسی های اضافی برمی گردد که به طور بالقوه می تواند منجر به کاهش عملکرد شود.
- پشتیبانی از Intel MPX (برنامههای افزودنی حفاظت از حافظه)، که برای بررسی نشانگرها برای محدودیتهای حافظه استفاده میشد، متوقف شده است (این فناوری گسترده نشده است و قبلاً از GCC و LLVM حذف شده است).
- مکانیسم prelink و متغیرهای محیطی مرتبط با آن LD_TRACE_PRELINKING و LD_USE_LOAD_BIAS منسوخ شده اند و در نسخه بعدی حذف خواهند شد.
آسیب پذیری ها رفع شد:
- CVE-2022-23218, CVE-2022-23219 - سرریز بافر در توابع svcunix_create و clnt_create، ناشی از کپی کردن محتویات پارامتر نام فایل در پشته بدون بررسی اندازه داده های کپی شده است. برای برنامههایی که بدون محافظت پشته و با استفاده از پروتکل «یونیکس» ساخته شدهاند، این آسیبپذیری میتواند منجر به اجرای کد مهاجم در هنگام پردازش نام فایلهای بسیار طولانی شود.
- CVE-2021-3998 یک آسیبپذیری در تابع realpath() است که به دلیل بازگشت، تحت شرایط خاص، مقدار نادرستی حاوی دادههای باقیمانده تمیز نشده از پشته است. برای برنامه fusermount SUID-root، این آسیب پذیری می تواند برای به دست آوردن اطلاعات حساس از حافظه پردازش، به عنوان مثال، برای به دست آوردن اطلاعات در مورد اشاره گرها استفاده شود.
- CVE-2021-3999 - سرریز بافر تک بایتی در تابع getcwd(). این مشکل ناشی از یک باگ است که از سال 1995 وجود داشته است. برای ایجاد سرریز، کافی است chdir() را در دایرکتوری "/" در یک فضای نام نقطه اتصال جداگانه فراخوانی کنید.
منبع: opennet.ru