Overview
About vulnerability
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.
Details
- Affected product:
- AlmaLinux 9.2 ESU , CentOS 7 ELS , CentOS 8.4 ELS , CentOS 8.5 ELS , CentOS Stream 8 ELS , CloudLinux 7 ELS , Oracle Linux 7 ELS , RHEL 7 ELS , TuxCare 9.6 ESU , Ubuntu 16.04 ELS , Ubuntu 18.04 ELS , Ubuntu 20.04 ELS
- Affected packages:
- kernel @ 4.18.0 (+13 more)
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.