Organizația Trifecta Tech Foundation, care dezvoltă proiecte precum ntpd-rs, sudo-rs, zlib-rs și bzip2-rs, a anunțat trecerea Firefox la utilizarea bibliotecii zlib-rs pentru compresie și decomprimare folosind metoda gzip. Pe lângă protecția împotriva problemelor cauzate de erori în gestionarea memoriei, trecerea de la zlib la zlib-rs a dus la o creștere remarcabilă a performanței — în testele efectuate, accelerarea a fost între 3,3 și 32,5 ori în operațiuni unice de decodare și între 2,7 și 10,86 ori în decodarea unui flux continuu.
Biblioteca zlib-rs a fost utilizată în versiunea Firefox 151, dar după integrarea acesteia, unii utilizatori s-au confruntat cu o problemă care a dus la închideri neașteptate din cauza depășirii limitelor permise. Se menționează că în codul scris în Rust, problema a dus la o oprire bruscă, în timp ce într-o situație similară în C aceasta ar fi condus la deteriorarea neobservată a datelor fără a opri funcționarea. Ca soluție, în versiunea 151.0.1 a fost restaurată utilizarea vechii biblioteci zlib.
Prima manifestare a problemei a fost observată în timpul testării versiunilor timpurii acum mai bine de un an, dar pe sistemele dezvoltatorilor nu a fost posibil să fie reprodusă. În cele din urmă, după un an de teste pe utilizatorii versiunilor beta, s-a decis activarea zlib-rs în versiunea Firefox 151. După o nouă serie de rapoarte de probleme și analiza tiparului, s-a descoperit că defectul a fost cauzat de o eroare în microcodul CPU Intel bazat pe microarhitectura Raptor Lake din generațiile 13 și 14, legată de utilizarea unui registru incorect.
Problema a apărut deoarece generatorul de cod LLVM folosea instrucțiunea „mov byte ptr [rsi + rdi + 1], ch” pentru a scrie în memorie rezultatele codării Huffman. Când această instrucțiune era executată pe CPU Raptor Lake, în loc de 8-15 biți din registrul RCX, corespunzători registrului CH specificat în instrucțiune, în memorie erau scriși biții 0-7, corespunzători registrului CL. În pregătirea lansării Firefox 152, eroarea a fost remediată printr-o soluție de compromis, iar patch-ul a fost transferat în compunerea principală a zlib-rs. Generarea instrucțiunii problematice a fost observată în LLVM 22 (în ramura LLVM 23 aflată în dezvoltare, aceasta nu este generată).
Sursa: opennet.ro
