openat в relibc больше не роняет программу при раскрутке стека

25.07.2026

В relibc исправлена ошибка безопасности в openat: сбой раскрутки стека приводил к аварийному завершению программы. Правка касается обработки исключений при разборе аргументов вызова.

Что такое раскрутка стека

Когда программу прерывает сигнал или в потоке срабатывает паника, среда выполнения проходит по стеку вызовов и запускает обработчики — вызывая деструкторы Rust, освобождая ресурсы. Это и есть раскрутка: в C она называется longjmp.

Если в этот момент обработчик не может отработать — например, из-за того, что он сам обращается к памяти, которая уже освобождена, — среда не может продолжить развёртывание. Вместо аккуратной ошибки получается аварийное завершение.

Почему это ошибка безопасности

Результат раскрутки зависит от того, что происходит с памятью. Если обработчик продолжает работать с уже освобождёнными данными, это путь к повреждению состояния, а не просто к неудобному сообщению об ошибке. Поэтому правка отнесена к исправлениям безопасности, а не к мелким улучшениям.

Что делать разработчику на Rust

Ничего: исправление уже в relibc. Но стоит понимать, что openat — это не open, а отдельная функция, которой пользуется практически весь код работы с файлами, включая std::fs в Rust. То есть ошибка была в самом горячем пути.

Оригинал

Коммит Fix an unwind-safety issue in openat от 25 июля 2026 года в репозитории redox-os/relibc; сводка «This Month in Redox — July 2026», раздел «Relibc Improvements»

Упоминаний: 1 · Просмотров: 2