Organizace Trifecta Tech Foundation, která vyvíjí projekty jako ntpd-rs, sudo-rs, zlib-rs a bzip2-rs, informovala o přechodu Firefoxu na používání knihovny zlib-rs pro kompresi a dekompresi s využitím metody gzip. Kromě ochrany před problémy způsobenými chybami při práci s pamětí vedl přechod ze zlib na zlib-rs k výraznému zvýšení výkonu — v provedených testech dosáhlo zrychlení rozsahu od 3.3 do 32.5 násobku při jednotlivých dekódovacích operacích a od 2.7 do 10.86 násobku při dekódování kontinuálního toku.
Knihovna zlib-rs byla využita ve verzi Firefox 151, ale po její integraci se někteří uživatelé setkali s problémem, který vedl k havarijnímu ukončení kvůli překročení povolených limitů. Je zmíněno, že v kódu napsaném v jazyce Rust problém vedl k havarijnímu zastavení, zatímco v C by podobná situace vedla k nepozorovanému poškození dat bez zastavení činnosti. Jako řešení bylo ve verzi 151.0.1 vráceno použití staré knihovny zlib.
První projev problému byl zaznamenán během testování raných sestavení před více než rokem, ale na systémech vývojářů nebyl možné ho reprodukovat. Nakonec, po roce testování na uživatelských beta verzích, bylo rozhodnuto aktivovat zlib-rs ve vydání Firefox 151. Po nové sérii zpráv o problémech a analýze vzorců bylo zjištěno, že chyba byla způsobena chybou v mikrocode CPU Intel založeného na mikroarchitektuře Raptor Lake 13 a 14 generace, související s použitím nesprávného registru.
Problém vznikal, protože generátor kódu LLVM používal instrukci „mov byte ptr [rsi + rdi + 1], ch“ při zápisu do paměti výsledků Huffmanova kódování. Při provádění této instrukce na CPU Raptor Lake byly místo 8-15 bitů z registru RCX, odpovídajících uvedenému registru CH, do paměti zapsány bity 0-7, odpovídající registru CL. Při přípravě vydání Firefox 152 byla chyba odstraněna obchvatem a patch byl přenesen do hlavního složení zlib-rs. Generace problémové instrukce byla zaznamenána v LLVM 22 (v právě vyvíjené větvi LLVM 23 není generována).
Zdroj: opennet.ru
