Организация Trifecta Tech Foundation, развивающая такие проекты, как ntpd-rs, sudo-rs, zlib-rs и bzip2-rs, рассказала о переходе Firefox на использование библиотеки zlib-rs для сжатия и распаковки c использованием метода gzip. Кроме защиты от проблем, вызванных ошибками при работе с памятью, переход с zlib на zlib-rs привёл к заметному повышению производительности — в проведённых тестах ускорение составило от 3.3 до 32.5 раз при единичных операциях декодирования и от 2.7 до 10.86 раз при декодировании непрерывного потока.
Библиотека 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 она не генерируется).
ಮೂಲ: opennet.ru
