Commit c2255ece authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Martin K. Petersen

scsi: pm8001: Avoid -Wrestrict warning

On some configurations, gcc warns about overlapping source and destination
arguments to snprintf:

drivers/scsi/pm8001/pm8001_init.c: In function 'pm8001_request_msix':
drivers/scsi/pm8001/pm8001_init.c:977:3: error: 'snprintf' argument 4 may overlap destination object 'pm8001_ha' [-Werror=restrict]
  977 |   snprintf(drvname, len, "%s-%d", pm8001_ha->name, i);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/scsi/pm8001/pm8001_init.c:962:56: note: destination object referenced by 'restrict'-qualified argument 1 was declared here
  962 | static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha)
      |                                ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~

I first assumed this was a gcc bug, as that should not happen, but a
reduced test case makes it clear that this happens when the loop counter is
not bounded by the array size.

Help the compiler out by adding an explicit limit here to make the code
slightly more robust and avoid the warning.

Link: https://godbolt.org/z/6T1qPM
Link: https://lore.kernel.org/r/20210323125458.1825564-1-arnd@kernel.orgAcked-by: default avatarJack Wang <jinpu.wang@ionos.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent f1891f9b
...@@ -963,6 +963,7 @@ static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha) ...@@ -963,6 +963,7 @@ static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha)
{ {
u32 i = 0, j = 0; u32 i = 0, j = 0;
int flag = 0, rc = 0; int flag = 0, rc = 0;
int nr_irqs = pm8001_ha->number_of_intr;
if (pm8001_ha->chip_id != chip_8001) if (pm8001_ha->chip_id != chip_8001)
flag &= ~IRQF_SHARED; flag &= ~IRQF_SHARED;
...@@ -971,7 +972,10 @@ static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha) ...@@ -971,7 +972,10 @@ static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha)
"pci_enable_msix request number of intr %d\n", "pci_enable_msix request number of intr %d\n",
pm8001_ha->number_of_intr); pm8001_ha->number_of_intr);
for (i = 0; i < pm8001_ha->number_of_intr; i++) { if (nr_irqs > ARRAY_SIZE(pm8001_ha->intr_drvname))
nr_irqs = ARRAY_SIZE(pm8001_ha->intr_drvname);
for (i = 0; i < nr_irqs; i++) {
snprintf(pm8001_ha->intr_drvname[i], snprintf(pm8001_ha->intr_drvname[i],
sizeof(pm8001_ha->intr_drvname[0]), sizeof(pm8001_ha->intr_drvname[0]),
"%s-%d", pm8001_ha->name, i); "%s-%d", pm8001_ha->name, i);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment