Trifecta Tech Foundation, mis arendab projekte nagu ntpd-rs, sudo-rs, zlib-rs ja bzip2-rs, teatas Firefoxi üleminekust zlib-rs teegi kasutamisele gzip meetodi jaoks andmete komprimeerimisel ja dekomprimeerimisel. Lisaks probleemide kaitsmisele, mis on põhjustatud mäluhalduse vigadest, tõi üleminek zlib-lt zlib-rs-le kaasa märgatava jõudluse kasvu – tehtud testides oli kiirusetõus vahemikus 3,3 kuni 32,5 korda üksikute dekodeerimisoperatsioonide puhul ja 2,7 kuni 10,86 korda pideva voolu dekodeerimisel.
Zlib-rs teek oli kaasatud Firefox 151 versiooni, kuid pärast selle integreerimist kogesid mõned kasutajad probleemi, mis põhjustas kokkukuuluvuse katkemise, kuna ületati lubatud piirid. Täheldatakse, et Rust keeles põhjustas probleem koodi kokku kukkumise, samas kui C keeles põhjustaks sarnane olukord andmete peent kahjustamist, ilma et töö lõpetataks. Probleemi lahenduseks viidi välja 151.0.1 versioonis tagasi vana zlib teegi kasutamine.
Esimene probleem ilmnes rohkem kui aasta tagasi varajaste versioonide testimise käigus, kuid arendajate süsteemides ei õnnestunud seda paljundada. Lõppkokkuvõttes, pärast aastast testimist beetaversioonide kasutajatega, otsustati aktiveerida zlib-rs Firefox 151 väljaandes. Pärast uut probleemide raportite seeriat ja mustri uurimist selgus, et tõrge oli põhjustatud Intel CPU mikrokoodi veast, mis puutub kokku Raptor Lake 13. ja 14. põlvkonna mikroarhitektuuri ning vale registri kasutamisest.
Probleem tekkis seetõttu, et LLVM koodi generaator kasutas käsku „mov byte ptr [rsi + rdi + 1], ch”, kirjutades Huffmani kodeerimise tulemusi mälu. Selle käsu täitmisel Raptor Lake CPU-l salvestati mälu bitti 0-7, mis vastab registrile CL, mitte oodatud 8-15 bitti registrist RCX, mis peaks vastama CH registrile. Firefox 152 versiooni ettevalmistamise käigus kõrvaldatakse viga ümbersõiduga ja patch kantakse põhikomplekti zlib-rs. Probleemse käsku genereerimine on täheldatud LLVM 22 versioonis (arenduses olevas LLVM 23 harus ei genereerita seda).
Allikas: opennet.ru
