Skip to content

Commit 120f1d9

Browse files
hdellermartinkpetersen
authored andcommitted
scsi: mpt3sas: Fix out-of-bounds compiler warning
I'm facing this warning when building for the parisc64 architecture: drivers/scsi/mpt3sas/mpt3sas_base.c: In function ‘_base_make_ioc_operational’: drivers/scsi/mpt3sas/mpt3sas_base.c:5396:40: warning: array subscript ‘Mpi2SasIOUnitPage1_t {aka struct _MPI2_CONFIG_PAGE_SASIOUNIT_1}[0]’ is partly outside array bounds of ‘unsigned char[20]’ [-Warray-bounds] 5396 | (le16_to_cpu(sas_iounit_pg1->SASWideMaxQueueDepth)) ? drivers/scsi/mpt3sas/mpt3sas_base.c:5382:26: note: referencing an object of size 20 allocated by ‘kzalloc’ 5382 | sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL); | ^~~~~~~~~~~~~~~~~~~~~~~ The problem is, that only 20 bytes are allocated with kmalloc(), which is sufficient to hold the bytes which are needed. Nevertheless, gcc complains because the whole Mpi2SasIOUnitPage1_t struct is 32 bytes in size and thus doesn't fit into those 20 bytes. This patch simply allocates all 32 bytes (instead of 20) and thus avoids the warning. There is no functional change introduced by this patch. While touching the code I cleaned up to calculation of max_wideport_qd, max_narrowport_qd and max_sata_qd to make it easier readable. Test successfully tested on a HP C8000 PA-RISC workstation with 64-bit kernel. Link: https://lore.kernel.org/r/YpZ197iZdDZSCzrT@p100 Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 1af48ff commit 120f1d9

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

drivers/scsi/mpt3sas/mpt3sas_base.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5369,6 +5369,7 @@ static int _base_assign_fw_reported_qd(struct MPT3SAS_ADAPTER *ioc)
53695369
Mpi2ConfigReply_t mpi_reply;
53705370
Mpi2SasIOUnitPage1_t *sas_iounit_pg1 = NULL;
53715371
Mpi26PCIeIOUnitPage1_t pcie_iounit_pg1;
5372+
u16 depth;
53725373
int sz;
53735374
int rc = 0;
53745375

@@ -5380,7 +5381,7 @@ static int _base_assign_fw_reported_qd(struct MPT3SAS_ADAPTER *ioc)
53805381
goto out;
53815382
/* sas iounit page 1 */
53825383
sz = offsetof(Mpi2SasIOUnitPage1_t, PhyData);
5383-
sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL);
5384+
sas_iounit_pg1 = kzalloc(sizeof(Mpi2SasIOUnitPage1_t), GFP_KERNEL);
53845385
if (!sas_iounit_pg1) {
53855386
pr_err("%s: failure at %s:%d/%s()!\n",
53865387
ioc->name, __FILE__, __LINE__, __func__);
@@ -5393,16 +5394,16 @@ static int _base_assign_fw_reported_qd(struct MPT3SAS_ADAPTER *ioc)
53935394
ioc->name, __FILE__, __LINE__, __func__);
53945395
goto out;
53955396
}
5396-
ioc->max_wideport_qd =
5397-
(le16_to_cpu(sas_iounit_pg1->SASWideMaxQueueDepth)) ?
5398-
le16_to_cpu(sas_iounit_pg1->SASWideMaxQueueDepth) :
5399-
MPT3SAS_SAS_QUEUE_DEPTH;
5400-
ioc->max_narrowport_qd =
5401-
(le16_to_cpu(sas_iounit_pg1->SASNarrowMaxQueueDepth)) ?
5402-
le16_to_cpu(sas_iounit_pg1->SASNarrowMaxQueueDepth) :
5403-
MPT3SAS_SAS_QUEUE_DEPTH;
5404-
ioc->max_sata_qd = (sas_iounit_pg1->SATAMaxQDepth) ?
5405-
sas_iounit_pg1->SATAMaxQDepth : MPT3SAS_SATA_QUEUE_DEPTH;
5397+
5398+
depth = le16_to_cpu(sas_iounit_pg1->SASWideMaxQueueDepth);
5399+
ioc->max_wideport_qd = (depth ? depth : MPT3SAS_SAS_QUEUE_DEPTH);
5400+
5401+
depth = le16_to_cpu(sas_iounit_pg1->SASNarrowMaxQueueDepth);
5402+
ioc->max_narrowport_qd = (depth ? depth : MPT3SAS_SAS_QUEUE_DEPTH);
5403+
5404+
depth = sas_iounit_pg1->SATAMaxQDepth;
5405+
ioc->max_sata_qd = (depth ? depth : MPT3SAS_SATA_QUEUE_DEPTH);
5406+
54065407
/* pcie iounit page 1 */
54075408
rc = mpt3sas_config_get_pcie_iounit_pg1(ioc, &mpi_reply,
54085409
&pcie_iounit_pg1, sizeof(Mpi26PCIeIOUnitPage1_t));

0 commit comments

Comments
 (0)