Библиотека zlib-rs была задействована в выпуске Firefox 151, но после её интеграции некоторые пользователи столкнулись с проблемой, приводившей к аварийному завершению из-за выхода за допустимые границы. Отмечается, что в коде на языке Rust проблема приводила к аварийной остановке, в то время как в Си подобная ситуация привела бы к незаметному повреждению данных без остановки работы. В качестве решения в выпуске 151.0.1 было возвращено использование старой библиотеки zlib.
Первое проявление проблемы было замечено в процессе тестирования ранних сборок более года назад, но на системах разработчиков её не удавалось воспроизвести. В конечном счёте, после года тестирования на пользователях бета-выпусков было решено активировать zlib-rs в релизе Firefox 151. После новой серии отчётов о проблемах и разбора закономерности было выяснено, что сбой вызван ошибкой в микрокоде CPU Intel на базе микроархитектуры Raptor Lake 13 и 14 поколений, связанной с использованием не того регистра.
Проблема возникала из-за того, что генератор кода LLVM использовал инструкцию «mov byte ptr [rsi + rdi + 1], ch» при записи в память результатов кодирования Хаффмана. При выполнении данной инструкции на CPU Raptor Lake вместо 8-15 битов из регистра RCX, соответствующих указанному в инструкции регистру CH, в память записывались биты 0-7, соответствующие регистру CL. При подготовке выпуска Firefox 152 ошибка была устранена обходным путём и патч перенесён в основной состав zlib-rs. Генерация проблемной инструкции замечена в LLVM 22 (в находящейся в разработке ветке LLVM 23 она не генерируется).
Источник: http://www.opennet.ru/opennews/art.shtml?num=65705
