Организация 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
