Linux: scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking
What fixes it
- 2e6f60adf609c77e828f64e0cd371920bef91c12LinuxCVE List
- 56e25d716833604fd5bff388e472f290bfe793aaLinuxCVE List
- 94fc0c5b45de2bf3a691619bcfd10b9a49fc647eLinuxCVE List
- 34a40e0dff940ac5eba494a69b553ea571e24873LinuxCVE 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:
scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking
qla25xx_free_req_que() and qla25xx_free_rsp_que() have two pre-existing bugs exposed on the error path of qla25xx_create_{req,rsp}_que():
- When dma_alloc_coherent() fails during queue creation, the error
path calls the free function with req->ring / rsp->ring still NULL (from kzalloc). The unconditional dma_free_coherent() with a NULL cpu_addr is undefined behavior and can panic.
- The free functions clear req_qid_map / rsp_qid_map under vport_lock,
but the create functions protect the same bitmaps with mq_lock. This provides no mutual exclusion. Additionally, the create error path clears the bit and releases mq_lock before calling the free function, creating a window where another thread can allocate the same que_id and have its ha->req_q_map entry clobbered by the subsequent lockless NULL assignment in the free function.
Fix by:
- Guarding dma_free_coherent() with a NULL check on the ring pointer.
- Using mq_lock (the lock held by all creators) in the free functions
to atomically NULL the map entry and clear the bitmap bit.
- Removing the now-redundant clear_bit blocks from the create error
paths since the free functions handle it atomically.
Text from CVE List
Affected versions 12
- Linuxaffected: 73208dfd7ab19f379d73e8a0fbf30f92c203e5e8 before 2e6f60adf609c77e828f64e0cd371920bef91c12CVE List
- Linuxaffected: 73208dfd7ab19f379d73e8a0fbf30f92c203e5e8 before 56e25d716833604fd5bff388e472f290bfe793aaCVE List
- Linuxaffected: 73208dfd7ab19f379d73e8a0fbf30f92c203e5e8 before f35cb67f2092b49d7949065dd56895ed47238f22CVE List
- Linuxaffected: 73208dfd7ab19f379d73e8a0fbf30f92c203e5e8 before 94fc0c5b45de2bf3a691619bcfd10b9a49fc647eCVE List
- Linuxaffected: 73208dfd7ab19f379d73e8a0fbf30f92c203e5e8 before 34a40e0dff940ac5eba494a69b553ea571e24873CVE List
- Linuxaffected: 2.6.29CVE List
- Linuxunaffected: all versions before 2.6.29CVE List
- Linuxunaffected: 6.6.160 through 6.6.*CVE List
- Linuxunaffected: 6.12.112 through 6.12.*CVE List
- Linuxunaffected: 6.18.53 through 6.18.*CVE List
- Linuxunaffected: 7.2.7 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 5
- git.kernel.org/stable/c/2e6f60adf609c77e828f64e0cd371920bef91c12Referencevia CVE List
- git.kernel.org/stable/c/56e25d716833604fd5bff388e472f290bfe793aaReferencevia CVE List
- git.kernel.org/stable/c/f35cb67f2092b49d7949065dd56895ed47238f22Referencevia CVE List
- git.kernel.org/stable/c/94fc0c5b45de2bf3a691619bcfd10b9a49fc647eReferencevia CVE List
- git.kernel.org/stable/c/34a40e0dff940ac5eba494a69b553ea571e24873Referencevia CVE List