Die 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 zlib-rs-Bibliothek für die Kompression und Dekompression unter Verwendung des Gzip-Formats. Neben dem Schutz vor Problemen, die durch Fehler im Speicherbetrieb verursacht werden, führte der Wechsel von zlib zu zlib-rs zu einer bemerkenswerten Leistungssteigerung – in durchgeführten Tests betrug die Beschleunigung 3,3 bis 32,5 Mal bei einzelnen Dekodierungsoperationen und 2,7 bis 10,86 Mal bei der Dekodierung eines kontinuierlichen Stroms.
Die zlib-rs-Bibliothek wurde mit der Veröffentlichung von Firefox 151 eingeführt, doch nach ihrer Integration hatten einige Benutzer mit einem Problem zu kämpfen, das zu Abstürzen aufgrund von Überlauf führte. Es wird berichtet, dass ein Problem im Rust-Code zu einem Absturz führte, während eine ähnliche Situation in C zu unbemerkten Datenbeschädigungen ohne Programmstopp geführt hätte. Als Lösung wurde in der Version 151.0.1 die alte zlib-Bibliothek erneut verwendet.
Das erste Auftreten des Problems wurde während der Tests der frühen Builds vor mehr als einem Jahr festgestellt, konnte jedoch auf den Entwicklersystemen nicht reproduziert werden. Letztendlich wurde nach einem Jahr Beta-Tests bei Nutzern entschieden, zlib-rs in der Version Firefox 151 zu aktivieren. Nach einer neuen Reihe von Problemmeldungen und der Analyse von Mustern stellte sich heraus, dass der Absturz durch einen Fehler im Mikrocode der Intel-CPUs der Mikroarchitektur Raptor Lake der 13. und 14. Generation verursacht wurde, der mit der Verwendung eines falschen Registers zusammenhing.
Das Problem trat auf, weil der LLVM-Codegenerator den Befehl "mov byte ptr [rsi + rdi + 1], ch" verwendete, um die Ergebnisse der Huffman-Codierung im Speicher zu schreiben. Bei der Ausführung dieses Befehls auf dem Raptor Lake-CPU wurden anstelle von 8-15 Bits aus dem Register RCX, die dem im Befehl angegebenen Register CH entsprechen, die Bits 0-7, die dem Register CL zugeordnet sind, in den Speicher geschrieben. Bei der Vorbereitung des Releases Firefox 152 wurde der Fehler durch einen Workaround behoben und der Patch in die Hauptversion von zlib-rs übernommen. Die problematische Anweisung wurde in LLVM 22 erkannt (in der in Entwicklung befindlichen Version LLVM 23 wird sie nicht generiert).
Quelle: opennet.ru
