Organisationen Trifecta Tech Foundation, som utvecklar projekt som ntpd-rs, sudo-rs, zlib-rs och bzip2-rs, har meddelat att Firefox har övergĂ„tt till att anvĂ€nda biblioteket zlib-rs för komprimering och dekomprimering med gzip-metoden. Förutom att undvika problem orsakade av minnesfel har övergĂ„ngen frĂ„n zlib till zlib-rs lett till en mĂ€rkbar prestandaökning â i genomförda tester uppmĂ€ttes en acceleration pĂ„ mellan 3,3 och 32,5 gĂ„nger för enstaka avkodningsoperationer och mellan 2,7 och 10,86 gĂ„nger för avkodning av kontinuerlig ström.
Biblioteket zlib-rs anvÀndes i Firefox version 151, men efter integreringen stötte vissa anvÀndare pÄ ett problem som ledde till krasch pÄ grund av att tillÄtna grÀnser överskreds. Det noterades att i Rust-koden orsakade problemet en krasch, medan en liknande situation i C skulle ha lett till osynlig datakorruption utan att programmet stoppades. Som en lösning ÄterstÀlldes anvÀndningen av det Àldre zlib-biblioteket i version 151.0.1.
Det första mÀrket av problemet upptÀcktes under testningen av tidiga versioner för mer Àn ett Är sedan, men det kunde inte reproducera pÄ utvecklarens system. Efter ett Ärs testning pÄ anvÀndare av betaversioner beslutades det att aktivera zlib-rs i den officiella versionen av Firefox 151. Efter en ny serie problemrapporter och analys av mönster fann man att kraschen orsakades av en felaktighet i CPU-mikrokoden för Intel-baserade processorer av mikroarkitekturen Raptor Lake i generation 13 och 14, relaterad till anvÀndningen av fel register.
Problemet uppstod eftersom LLVM:s kodgenerator anvÀnde instruktionen "mov byte ptr [rsi + rdi + 1], ch" nÀr den skrev resultaten av Huffman-kodningen till minnet. NÀr denna instruktion utfördes pÄ Raptor Lake CPU:n, istÀllet för 8-15 bitar frÄn registret RCX, som motsvarade registret CH i instruktionen, skrevs bitar 0-7, som motsvarade registret CL, till minnet. Vid förberedelserna för version 152 av Firefox ÄtgÀrdades felet med en workaround och patchen överfördes till huvudkompositionen av zlib-rs. Genereringen av den problematiska instruktionen har noterats i LLVM 22 (i den utvecklade versionen av LLVM 23 genereras den inte).
KĂ€lla: opennet.ru
