A Trifecta Tech Foundation, a desenvolvedora de proxectos como ntpd-rs, sudo-rs, zlib-rs e bzip2-rs, anunciou a transición de Firefox ao uso da biblioteca zlib-rs para a compresión e descompresión gzip. Ademais de protexer contra erros de memoria, o cambio de zlib a zlib-rs supuxo unha mellora significativa do rendemento: nas probas, a aceleración oscilou entre 3.3 e 32.5 veces para operacións de descodificación únicas e entre 2.7 e 10.86 veces para a descodificación de fluxo continuo.
A biblioteca zlib-rs incluíuse na versión 151 de Firefox, pero despois da súa integración, algúns usuarios atoparon un problema que provocou un peche debido a unha execución fóra dos límites. Observouse que no código Rust, o problema provocaba un peche, mentres que no código C, unha situación similar provocaría a corrupción silenciosa dos datos sen deter o programa. Como solución, a biblioteca zlib máis antiga volveuse usar na versión 151.0.1.
A primeira manifestación do problema observouse durante as probas das primeiras compilacións hai máis dun ano, pero non se puido reproducir en sistemas de desenvolvedores. Finalmente, tras un ano de probas con usuarios beta, decidiuse activar zlib-rs en Firefox 151. Tras unha nova serie de informes de problemas e unha investigación sobre o patrón, descubriuse que o fallo fora causado por un erro de microcódigo nas CPU Intel baseadas na microarquitectura Raptor Lake de 13.ª e 14.ª xeración, relacionado co uso dun rexistro incorrecto.
O problema produciuse porque o xerador de código LLVM empregaba a instrución "mov byte ptr [rsi + rdi + 1], ch" ao escribir os resultados da codificación de Huffman na memoria. Ao executar esta instrución nunha CPU de Raptor Lake, en lugar de escribir de 8 a 15 bits do rexistro RCX, correspondentes ao rexistro CH especificado na instrución, os bits 0 a 7, correspondentes ao rexistro CL, escribíanse na memoria. Implementouse unha solución alternativa como preparación para Firefox 152 e o parche trasladouse á versión principal de zlib-rs. Observouse a xeración da instrución problemática en LLVM 22 (non se xera na rama de desenvolvemento de LLVM 23).
Fonte: opennet.ru
