Skip to content

Commit 398ac5a

Browse files
committed
Merge: CVE-2024-40901: scsi: mpt3sas: Avoid test/set_bit() operating in non-allocated memory
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/4694 JIRA: https://issues.redhat.com/browse/RHEL-47535 CVE: CVE-2024-40901 ``` scsi: mpt3sas: Avoid test/set_bit() operating in non-allocated memory There is a potential out-of-bounds access when using test_bit() on a single word. The test_bit() and set_bit() functions operate on long values, and when testing or setting a single word, they can exceed the word boundary. KASAN detects this issue and produces a dump: BUG: KASAN: slab-out-of-bounds in _scsih_add_device.constprop.0 (./arch/x86/include/asm/bitops.h:60 ./include/asm-generic/bitops/instrumented-atomic.h:29 drivers/scsi/mpt3sas/mpt3sas_scsih.c:7331) mpt3sas Write of size 8 at addr ffff8881d26e3c60 by task kworker/u1536:2/2965 For full log, please look at [1]. Make the allocation at least the size of sizeof(unsigned long) so that set_bit() and test_bit() have sufficient room for read/write operations without overwriting unallocated memory. [1] Link: https://lore.kernel.org/all/ZkNcALr3W3KGYYJG@gmail.com/ Fixes: c696f7b ("scsi: mpt3sas: Implement device_remove_in_progress check in IOCTL path") Cc: stable@vger.kernel.org Suggested-by: Keith Busch <kbusch@kernel.org> Signed-off-by: Breno Leitao <leitao@debian.org> Link: https://lore.kernel.org/r/20240605085530.499432-1-leitao@debian.org Reviewed-by: Keith Busch <kbusch@kernel.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> (cherry picked from commit 4254dfe) ``` Signed-off-by: CKI Backport Bot <cki-ci-bot+cki-gitlab-backport-bot@redhat.com> Approved-by: Tomas Henzl <thenzl@redhat.com> Approved-by: Chris Leech <cleech@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Scott Weaver <scweaver@redhat.com>
2 parents 6b91941 + 61c0289 commit 398ac5a

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

drivers/scsi/mpt3sas/mpt3sas_base.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8484,6 +8484,12 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
84848484
ioc->pd_handles_sz = (ioc->facts.MaxDevHandle / 8);
84858485
if (ioc->facts.MaxDevHandle % 8)
84868486
ioc->pd_handles_sz++;
8487+
/*
8488+
* pd_handles_sz should have, at least, the minimal room for
8489+
* set_bit()/test_bit(), otherwise out-of-memory touch may occur.
8490+
*/
8491+
ioc->pd_handles_sz = ALIGN(ioc->pd_handles_sz, sizeof(unsigned long));
8492+
84878493
ioc->pd_handles = kzalloc(ioc->pd_handles_sz,
84888494
GFP_KERNEL);
84898495
if (!ioc->pd_handles) {
@@ -8501,6 +8507,13 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
85018507
ioc->pend_os_device_add_sz = (ioc->facts.MaxDevHandle / 8);
85028508
if (ioc->facts.MaxDevHandle % 8)
85038509
ioc->pend_os_device_add_sz++;
8510+
8511+
/*
8512+
* pend_os_device_add_sz should have, at least, the minimal room for
8513+
* set_bit()/test_bit(), otherwise out-of-memory may occur.
8514+
*/
8515+
ioc->pend_os_device_add_sz = ALIGN(ioc->pend_os_device_add_sz,
8516+
sizeof(unsigned long));
85048517
ioc->pend_os_device_add = kzalloc(ioc->pend_os_device_add_sz,
85058518
GFP_KERNEL);
85068519
if (!ioc->pend_os_device_add) {
@@ -8792,6 +8805,12 @@ _base_check_ioc_facts_changes(struct MPT3SAS_ADAPTER *ioc)
87928805
if (ioc->facts.MaxDevHandle % 8)
87938806
pd_handles_sz++;
87948807

8808+
/*
8809+
* pd_handles should have, at least, the minimal room for
8810+
* set_bit()/test_bit(), otherwise out-of-memory touch may
8811+
* occur.
8812+
*/
8813+
pd_handles_sz = ALIGN(pd_handles_sz, sizeof(unsigned long));
87958814
pd_handles = krealloc(ioc->pd_handles, pd_handles_sz,
87968815
GFP_KERNEL);
87978816
if (!pd_handles) {

0 commit comments

Comments
 (0)