В ядре Linux устранена следующая уязвимость:
предохранитель: исправлена гонка между прерыванием и повторной отправкой
После коммита f8fce75fedf7 («предохранитель: очистите intr_entry в fuuse_resend и
Fuse_remove_pending_req") WARN_ON(!list_empty(&req->intr_entry)) в
Fuse_request_free() по-прежнему срабатывает из-за следующей гонки:
В запросе_ожидания_ответа()
if (test_bit(FR_SENT, &req->flags)) -> возвращает true
В Fuse_chan_resend()
Clear_bit (FR_SENT, &req-> флаги)
В запросе_ожидания_ответа()
очередь_прерывания (требуется)
Исправить:
- переместить очистку FR_SENT внутри fpq->lock
- переместить настройку FR_PENDING внутрь fiq->lock
— перепроверьте FR_SENT после получения fiq->lock в Fuse_dev_queue_interrupt()
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: fuse: fix race between interrupt and resend After commit f8fce75fedf7 ("fuse: clear intr_entry in fuse_resend and fuse_remove_pending_req") the WARN_ON(!list_empty(&req->intr_entry)) in fuse_request_free() still triggers due to the following race: In request_wait_answer() if (test_bit(FR_SENT, &req->flags)) -> returns true In fuse_chan_resend() clear_bit(FR_SENT, &req->flags) In request_wait_answer() queue_interrupt(req) Fix by: - move clearing FR_SENT inside fpq->lock - move setting FR_PENDING inside fiq->lock - recheck FR_SENT after acquiring fiq->lock in fuse_dev_queue_interrupt()