A Trifecta Tech Foundation, desenvolvedora de projetos como ntpd-rs, sudo-rs, zlib-rs e bzip2-rs, anunciou a transição do Firefox para o uso da biblioteca zlib-rs para compressão e descompressão gzip. Além de proteger contra erros de memória, a mudança do zlib para o zlib-rs resultou em um aumento significativo de desempenho — em testes, o ganho de velocidade variou de 3.3 a 32.5 vezes para operações de decodificação única e de 2.7 a 10.86 vezes para decodificação de fluxo contínuo.
A biblioteca zlib-rs foi incluída no Firefox versão 151, mas após sua integração, alguns usuários encontraram um problema que resultava em travamento devido à execução fora dos limites do programa. Observou-se que, em código Rust, o problema causava o travamento, enquanto em código C, uma situação semelhante resultaria em corrupção silenciosa de dados sem interromper o programa. Como solução, a versão anterior da biblioteca zlib foi revertida para uso na versão 151.0.1.
A primeira manifestação do problema foi notada durante os testes de versões preliminares há mais de um ano, mas não pôde ser reproduzida em sistemas de desenvolvedores. Finalmente, após um ano de testes com usuários beta, decidiu-se habilitar o zlib-rs no Firefox 151. Após uma nova série de relatos de problemas e uma investigação do padrão, descobriu-se que a falha era causada por um erro de microcódigo em CPUs Intel baseadas na microarquitetura Raptor Lake de 13ª e 14ª geração, relacionado ao uso de um registrador incorreto.
O problema ocorreu porque o gerador de código LLVM usou a instrução "mov byte ptr [rsi + rdi + 1], ch" ao escrever os resultados da codificação Huffman na memória. Ao executar essa instrução em uma CPU Raptor Lake, em vez de escrever os bits 8 a 15 do registrador RCX, correspondentes ao registrador CH especificado na instrução, os bits 0 a 7, correspondentes ao registrador CL, foram escritos na memória. Uma solução alternativa foi implementada em preparação para o Firefox 152, e a correção foi incorporada à versão principal do zlib-rs. A geração da instrução problemática foi observada no LLVM 22 (ela não é gerada na versão de desenvolvimento do LLVM 23).
Fonte: opennet.ru
