В ядре Linux устранена следующая уязвимость:
можно: mcp251x: исправить тупик в пути ошибки mcp251x_open
Функция mcp251x_open() вызывает free_irq() в своем пути ошибки с
Мьютекс mpc_lock удерживается. Но если прерывание уже произошло,
обработчик прерываний будет ждать mpc_lock и free_irq().
тупик, ожидающий завершения обработчика. Эта проблема аналогична той, которая исправлена в коммите 7dd9c26bd6cf («can:
mcp251x: исправлена взаимоблокировка, если во время mcp251x_open происходит прерывание"), но
для пути ошибки.
Чтобы решить эту проблему, переместите вызов free_irq() после блокировки.
выпущен. Заранее установив `priv->force_quit = 1`, убедитесь, что IRQ
обработчик выйдет сразу после получения блокировки.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: can: mcp251x: fix deadlock in error path of mcp251x_open The mcp251x_open() function call free_irq() in its error path with the mpc_lock mutex held. But if an interrupt already occurred the interrupt handler will be waiting for the mpc_lock and free_irq() will deadlock waiting for the handler to finish. This issue is similar to the one fixed in commit 7dd9c26bd6cf ("can: mcp251x: fix deadlock if an interrupt occurs during mcp251x_open") but for the error path. To solve this issue move the call to free_irq() after the lock is released. Setting `priv->force_quit = 1` beforehand ensure that the IRQ handler will exit right away once it acquired the lock.