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