De organisatie Trifecta Tech Foundation, die projecten ontwikkelt zoals ntpd-rs, sudo-rs, zlib-rs en bzip2-rs, heeft gesproken over de overgang van Firefox naar het gebruik van de zlib-rs bibliotheek voor compressie en decompressie met behulp van de gzip-methode. Naast het bieden van bescherming tegen problemen veroorzaakt door geheugenfouten, leidde de overstap van zlib naar zlib-rs tot een significante prestatieverbetering ā in de uitgevoerde tests varieerde de versnelling van 3,3 tot 32,5 keer bij individuele decodering en van 2,7 tot 10,86 keer bij de decodering van een continue stroom.
De zlib-rs bibliotheek werd gebruikt in de release van Firefox 151, maar na de integratie ervan ondervonden sommige gebruikers een probleem dat leidde tot een crash als gevolg van out-of-bounds toegang. Het wordt opgemerkt dat het probleem in de Rust-code leidde tot een crash, terwijl in C een soortgelijke situatie zou hebben geleid tot onopgemerkte gegevensbeschading zonder de werking te stoppen. Als oplossing werd in release 151.0.1 de oude zlib-bibliotheek weer in gebruik genomen.
Het eerste optreden van het probleem werd meer dan een jaar geleden opgemerkt tijdens het testen van vroege builds, maar kon niet worden gereproduceerd op de systemen van de ontwikkelaars. Uiteindelijk, na een jaar testen op gebruikers van beta-releases, werd besloten om zlib-rs te activeren in de release van Firefox 151. Na een nieuwe reeks probleemrapporten en het analyseren van de patronen, werd vastgesteld dat de storing werd veroorzaakt door een fout in de microcode van de Intel CPU gebaseerd op de Raptor Lake microarchitectuur van de 13e en 14e generatie, gerelateerd aan het gebruik van een verkeerd register.
Het probleem deed zich voor omdat de LLVM codegenerator de instructie 'mov byte ptr [rsi + rdi + 1], ch' gebruikte bij het schrijven van de geheugenresultaten van Huffman-codering. Bij het uitvoeren van deze instructie op een Raptor Lake CPU werden in plaats van 8-15 bits uit het register RCX, die overeenkwamen met het register CH zoals aangegeven in de instructie, bits 0-7, overeenkomend met register CL, naar het geheugen geschreven. Bij de voorbereiding van de release van Firefox 152 werd de fout omzeild en de patch in de hoofdversie van zlib-rs overgebracht. De problematische instructie werd opgemerkt in LLVM 22 (in de ontwikkelingsbranch LLVM 23 wordt deze niet gegenereerd).
Bron: opennet.ru
