Die Organisation Trifecta Tech Foundation, die Projekte wie ntpd-rs, sudo-rs, zlib-rs und bzip2-rs entwickelt, berichtete über den Wechsel von Firefox zur Nutzung der Bibliothek zlib-rs für die Kompression und Dekompression unter Verwendung der gzip-Methode. Neben dem Schutz vor Problemen, die durch Fehler im Umgang mit dem Speicher verursacht werden, führte der Wechsel von zlib zu zlib-rs zu einer spürbaren Leistungssteigerung – in durchgeführten Tests betrug die Beschleunigung zwischen 3,3 und 32,5-fach bei Einzelfall dekodierungen und zwischen 2,7 und 10,86-fach bei der Dekodierung eines kontinuierlichen Stroms.
Die Bibliothek zlib-rs wurde in der Ausgabe von Firefox 151 verwendet, aber nach ihrer Integration hatten einige Benutzer ein Problem, das zu Abstürzen aufgrund von Grenzwertüberschreitungen führte. Es wird berichtet, dass im Rust-Code das Problem zu einem Absturz führte, während in C eine solche Situation zu unbemerkt beschädigten Daten ohne Arbeitsunterbrechung geführt hätte. Als Lösung wurde in der Version 151.0.1 die alte Bibliothek zlib wieder aktiviert.
Das erste Auftreten des Problems wurde während der Testphase früherer Builds vor über einem Jahr festgestellt, konnte jedoch auf den Systemen der Entwickler nicht reproduziert werden. Schlussendlich wurde nach einem Jahr Testen an Beta-Nutzern beschlossen, zlib-rs in der Veröffentlichung von Firefox 151 zu aktivieren. Nach einer neuen Reihe von Problemberichten und der Analyse von Mustern wurde festgestellt, dass der Fehler durch einen Bug im CPU-Mikrocode von Intel auf der Mikroarchitektur Raptor Lake der 13. und 14. Generation verursacht wurde, der mit der Verwendung des falschen Registers verbunden war.
Das Problem trat auf, weil der LLVM-Codegenerator den Befehl "mov byte ptr [rsi + rdi + 1], ch" beim Schreiben der Ergebnisse der Huffman-Codierung in den Speicher verwendete. Bei der Ausführung dieses Befehls auf der CPU Raptor Lake wurden anstelle von 8-15 Bits aus dem Register RCX, die dem in dem Befehl angegebenen Register CH entsprach, die Bits 0-7, die dem Register CL entsprechen, im Speicher abgelegt. Bei der Vorbereitung der Veröffentlichung von Firefox 152 wurde der Fehler mit einem Workaround behoben und der Patch in den Hauptbestand von zlib-rs übertragen. Die problematische Anweisung wurde in LLVM 22 festgestellt (in dem sich in Entwicklung befindlichen Branch LLVM 23 wird sie nicht erzeugt).
Quelle: opennet.ru
