Организация Trifecta Tech Foundation, развиваща проекти като ntpd-rs, sudo-rs, zlib-rs и bzip2-rs, съобщи за прехода на Firefox към използването на библиотеката zlib-rs за компресия и декомпресия с използването на метода gzip. Освен защита от проблеми, причинени от грешки при работа с паметта, преминаването от zlib на zlib-rs доведе до забележително увеличаване на производителността - в проведените тестове ускорението варира от 3.3 до 32.5 пъти за единични операции по декодиране и от 2.7 до 10.86 пъти при декодиране на непрекъснат поток.
Библиотеката zlib-rs бе включена в версия Firefox 151, но след интеграцията й някои потребители се сблъскаха с проблем, довеждащ до аварийно спиране поради излизане извън допустимите граници. Отбелязва се, че в кода на Rust проблемът е предизвикал аварийно спиране, докато в C подобна ситуация би довела до незабележимо повреда на данни без спиране на работата. Като решение, в версия 151.0.1 бе възстановено използването на старата библиотека zlib.
Първото проявление на проблема беше забелязано по време на тестовете на ранни версии преди повече от година, но на системите на разработчиците не успяха да го възпроизведат. В крайна сметка, след година тестове на потребители на бета версии, беше решено да се активира zlib-rs в релиза на Firefox 151. След нова серия отчети за проблеми и анализ на закономерността беше установено, че сривът е предизвикан от грешка в микрокода на CPU Intel на базата на микроархитектурата Raptor Lake от 13 и 14 поколения, свързана с използването на грешния регистър.
Проблемът възникваше, защото генераторът на код LLVM използваше инструкцията „mov byte ptr [rsi + rdi + 1], ch“ при запис в паметта на резултатите от Хаффмановото кодиране. При изпълнението на тази инструкция на CPU Raptor Lake вместо 8-15 бита от регистра RCX, съответстващи на указания в инструкцията регистър CH, в паметта бяха записвани битовете 0-7, отговарящи на регистра CL. При подготовката на версия Firefox 152 грешката беше отстранена обходно и патчът беше прехвърлен в основната част на zlib-rs. Генерация на проблемната инструкция е забелязана в LLVM 22 (в разработващата се версия LLVM 23 тя не се генерира).
Източник: opennet.ru
