Linux: dmaengine: Fix device kref underflow in dma_chan_put()
What fixes it
- 036b527f92570206da4b8c40b38f8d689e29d0f3LinuxCVE List
- 5fb1797a8c9485e40e5492fa0338ab5c7d1f3fefLinuxCVE List
- 57f7f1c6827be7d8f80feca48d2125fb91c6f6edLinuxCVE List
- 7c3f4ce651d43705f9ec7f778f642a90d5ff4fbaLinuxCVE List
- 1a0d9b406febf23054ad595fd47b29325e70fb2dLinuxCVE List
- 77906ac448d2fa81fa710ae26c0e591ebdc81154LinuxCVE List
Show all 7 fixed versions
- 44dab659064eb5c10adb0306510eebe848ed592dLinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
dmaengine: Fix device kref underflow in dma_chan_put()
dma_chan_get() takes chan->device->ref only on the slow path:
/* no kref on fast path */ if (chan->client_count) { __module_get(owner); chan->client_count++; return 0; } if (!try_module_get(owner)) return -ENODEV; if (!dma_device_get(chan->device)) { // calls kref_get_unless_zero()
dma_chan_put() drops the ref unconditionally, so every fast-path get/put pair drops one extra device reference.
The bug fires when two conditions hold together: a non-private provider has a persistent client holding chan->client_count > 0 and another client cycles dmaengine_get()/dmaengine_put(). When the kref hits zero, the subsequent dma_find_channel() returns NULL even though the provider module is still loaded.
Fix this by dropping device->ref only on the last put, matching the single slow-path get.
Text from CVE List
Affected versions 18
- Linuxaffected: 8ad342a863590b24ce77681b7e081363fb3333f7 before 036b527f92570206da4b8c40b38f8d689e29d0f3CVE List
- Linuxaffected: 8ad342a863590b24ce77681b7e081363fb3333f7 before 5fb1797a8c9485e40e5492fa0338ab5c7d1f3fefCVE List
- Linuxaffected: 8ad342a863590b24ce77681b7e081363fb3333f7 before 57f7f1c6827be7d8f80feca48d2125fb91c6f6edCVE List
- Linuxaffected: 8ad342a863590b24ce77681b7e081363fb3333f7 before 7c3f4ce651d43705f9ec7f778f642a90d5ff4fbaCVE List
- Linuxaffected: 8ad342a863590b24ce77681b7e081363fb3333f7 before de2677e57d3161390d8a508f08cddec6ef7e4b23CVE List
- Linuxaffected: 8ad342a863590b24ce77681b7e081363fb3333f7 before 1a0d9b406febf23054ad595fd47b29325e70fb2dCVE List
- Linuxaffected: 8ad342a863590b24ce77681b7e081363fb3333f7 before 77906ac448d2fa81fa710ae26c0e591ebdc81154CVE List
- Linuxaffected: 8ad342a863590b24ce77681b7e081363fb3333f7 before 44dab659064eb5c10adb0306510eebe848ed592dCVE List
- Linuxaffected: 5.6CVE List
- Linuxunaffected: all versions before 5.6CVE List
- Linuxunaffected: 5.10.271 through 5.10.*CVE List
- Linuxunaffected: 5.15.222 through 5.15.*CVE List
- Linuxunaffected: 6.1.189 through 6.1.*CVE List
- Linuxunaffected: 6.6.158 through 6.6.*CVE List
- Linuxunaffected: 6.12.112 through 6.12.*CVE List
- Linuxunaffected: 6.18.54 through 6.18.*CVE List
- Linuxunaffected: 7.2.8 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 8
- git.kernel.org/stable/c/036b527f92570206da4b8c40b38f8d689e29d0f3Referencevia CVE List
- git.kernel.org/stable/c/5fb1797a8c9485e40e5492fa0338ab5c7d1f3fefReferencevia CVE List
- git.kernel.org/stable/c/57f7f1c6827be7d8f80feca48d2125fb91c6f6edReferencevia CVE List
- git.kernel.org/stable/c/7c3f4ce651d43705f9ec7f778f642a90d5ff4fbaReferencevia CVE List
- git.kernel.org/stable/c/de2677e57d3161390d8a508f08cddec6ef7e4b23Referencevia CVE List
- git.kernel.org/stable/c/1a0d9b406febf23054ad595fd47b29325e70fb2dReferencevia CVE List
- git.kernel.org/stable/c/77906ac448d2fa81fa710ae26c0e591ebdc81154Referencevia CVE List
- git.kernel.org/stable/c/44dab659064eb5c10adb0306510eebe848ed592dReferencevia CVE List