Skip to contentSkip to conversation

iomap: implement pcim_iounmap_regions()

PATCH In review Dan Carpenter 2 participants 5 messages Sep 16, 2015 – Sep 21, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hey Tejun,

These are very old.

The patch ec04b075843d: "iomap: implement pcim_iounmap_regions()" from Mar 9, 2007, leads to the following static checker warning:

	lib/devres.c:425 pcim_iounmap_regions()
	error: buffer overflow 'iomap' 6 <= 16

lib/devres.c
405 /**

   406   * pcim_iounmap_regions - Unmap and release PCI BARs
   407   * @pdev: PCI device to map IO resources for
   408   * @mask: Mask of BARs to unmap and release
   409   *
   410   * Unmap and release regions specified by @mask.
   411   */

412 void pcim_iounmap_regions(struct pci_dev *pdev, int mask) 413 {
414 void __iomem * const *iomap;
415 int i;
416
417 iomap = pcim_iomap_table(pdev);
418 if (!iomap)
419 return;
420
421 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
422 if (!(mask & (1 << i)))
423 continue;

Probably maks is always valid is what helps us but basically the static checker is suggesting that instead of DEVICE_COUNT_RESOURCE we should be using PCI_ROM_RESOURCE or PCIM_IOMAP_MAX. It could be that this was deliberate though...

   424  
   425                  pcim_iounmap(pdev, iomap[i]);
   426                  pci_release_region(pdev, i);
   427          }
   428  }

regards,
dan carpenter

#1 lore raw

Hello,

Quoted 8 lines · Dan Carpenter
   421          for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
   422                  if (!(mask & (1 << i)))
   423                          continue;

Probably maks is always valid is what helps us but basically the static checker is suggesting that instead of DEVICE_COUNT_RESOURCE we should be using PCI_ROM_RESOURCE or PCIM_IOMAP_MAX. It could be that this was deliberate though...

Looks like a silly mistake on my part. Care to submit a patch?

Thanks.

Signature · 1 line
tejun
#2 lore raw

PATCH 1/1 devres: fix a for loop bounds check

The iomap[] array has PCIM_IOMAP_MAX (6) elements and not DEVICE_COUNT_RESOURCE (16). This bug was found using a static checker. It may be that the "if (!(mask & (1 << i)))" check means we never actually go past the end of the array in real life.

Fixes ec04b075843d ('iomap: implement pcim_iounmap_regions()')
lib/devres.c +1 -1
index f13a246..8c85672 100644
@@ -418,7 +418,7 @@ void pcim_iounmap_regions(struct pci_dev *pdev, int mask)
 	if (!iomap)
 		return;
 
-	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+	for (i = 0; i < PCIM_IOMAP_MAX; i++) {
 		if (!(mask & (1 << i)))
 			continue;
 
Acked-by on v1 1/1
#3 lore raw

Re: [patch] devres: fix a for loop bounds check

Quoted 7 lines · Dan Carpenter

The iomap[] array has PCIM_IOMAP_MAX (6) elements and not DEVICE_COUNT_RESOURCE (16). This bug was found using a static checker. It may be that the "if (!(mask & (1 << i)))" check means we never actually go past the end of the array in real life.

Fixes ec04b075843d ('iomap: implement pcim_iounmap_regions()')

Thanks.

Signature · 1 line
tejun
#4 lore raw
In reply to Dan Carpenter
Quoted 7 lines · Tejun Heo

Hello,

Quoted 4 lines · Dan Carpenter
   421          for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
   422                  if (!(mask & (1 << i)))
   423                          continue;
Quoted 7 lines
Quoted 4 lines

Probably maks is always valid is what helps us but basically the static checker is suggesting that instead of DEVICE_COUNT_RESOURCE we should be using PCI_ROM_RESOURCE or PCIM_IOMAP_MAX. It could be that this was deliberate though...

Looks like a silly mistake on my part. Care to submit a patch?

Sure, I will do that.

regards,
dan carpenter