Nadace Trifecta Tech Foundation, vývojář projektů jako ntpd-rs, sudo-rs, zlib-rs a bzip2-rs, oznámila přechod Firefoxu na používání knihovny zlib-rs pro kompresi a dekompresi gzip. Kromě ochrany před chybami paměti vedl přechod z knihovny zlib na zlib-rs k výraznému zvýšení výkonu – v testech se zrychlení pohybovalo od 3.3 do 32.5krát pro dekódování jednoho souboru a od 2.7 do 10.86krát pro dekódování kontinuálního proudu.
Knihovna zlib-rs byla součástí Firefoxu verze 151, ale po její integraci se někteří uživatelé setkali s problémem, který vedl k pádu programu kvůli spuštění mimo povolený rozsah. Bylo zjištěno, že v kódu Rust tento problém vedl k pádu programu, zatímco v kódu C by podobná situace vedla k tichému poškození dat bez zastavení programu. Jako řešení byla ve verzi 151.0.1 vrácena starší knihovna zlib.
První projev problému byl zaznamenán během testování raných verzí před více než rokem, ale nebylo možné jej reprodukovat na vývojářských systémech. Nakonec, po roce testování s beta uživateli, bylo rozhodnuto povolit zlib-rs ve Firefoxu 151. Po nové sérii hlášení o problémech a prošetření vzorce bylo zjištěno, že pád byl způsoben chybou mikrokódu v procesorech Intel založených na mikroarchitektuře Raptor Lake 13. a 14. generace, která souvisela s použitím nesprávného registru.
K problému došlo, protože generátor kódu LLVM použil instrukci „mov byte ptr [rsi + rdi + 1], ch“ při zápisu výsledků Huffmanova kódování do paměti. Při provádění této instrukce na procesoru Raptor Lake se místo zápisu 8–15 bitů z registru RCX, odpovídajících registru CH zadanému v instrukci, do paměti zapisovaly bity 0–7, odpovídající registru CL. V rámci přípravy na Firefox 152 bylo implementováno alternativní řešení a oprava byla portována do hlavní verze zlib-rs. Generování problematické instrukce bylo pozorováno v LLVM 22 (ve vývojové větvi LLVM 23 není generována).
Zdroj: opennet.ru
