A organização Trifecta Tech Foundation, desenvolvendo 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 utilizando o método gzip. Além de proteger contra problemas causados por erros de manipulação de memória, a transição de zlib para zlib-rs resultou em um aumento significativo de desempenho — nos testes realizados, o aumento variou de 3,3 a 32,5 vezes em operações únicas de decodificação e de 2,7 a 10,86 vezes na decodificação de fluxos contínuos.
A biblioteca zlib-rs foi implementada na versão 151 do Firefox, mas após sua integração, alguns usuários enfrentaram um problema que causava falhas devido a saídas dos limites permitidos. Observa-se que, em código escrito em Rust, o problema resultava em uma parada inesperada, enquanto em C uma situação semelhante causaria uma corrupção de dados imperceptível sem interromper a operação. Como solução, a versão 151.0.1 reverteu para o uso da antiga biblioteca zlib.
A primeira manifestação do problema foi notada durante os testes de compilações iniciais há mais de um ano, mas não foi reproduzida nos sistemas dos desenvolvedores. Finalmente, após um ano de testes com usuários de versões beta, foi decidido ativar zlib-rs na versão 151 do Firefox. Após uma nova série de relatórios sobre problemas e uma análise dos padrões, foi descoberto que a falha foi causada por um erro no microcódigo da CPU Intel baseado na microarquitetura Raptor Lake das gerações 13 e 14, relacionado ao uso de um registro incorreto.
O problema surgiu porque o gerador de código LLVM usava a instrução "mov byte ptr [rsi + rdi + 1], ch" ao gravar na memória os resultados da codificação de Huffman. Ao executar essa instrução na CPU Raptor Lake, em vez de 8-15 bits do registro RCX, correspondentes ao registro CH especificado na instrução, bits 0-7, correspondentes ao registro CL, eram gravados na memória. Na preparação para a versão 152 do Firefox, a falha foi contornada e o patch foi transferido para a composição principal de zlib-rs. A geração da instrução problemática foi notada no LLVM 22 (na ramificação em desenvolvimento do LLVM 23, ela não é gerada).
Fonte: opennet.ru
