[PATCH] applicom LEAK #warning

From: Randy.Dunlap
Date: Wed Sep 17 2003 - 13:19:30 EST



Hi David,

This is an attempt to fix the LEAK #warning in applicom.c.
The patch calls iounmap() for the composite memory area
after all of the individual areas are mapped. Is that OK?

It also adds some unwinding of resources on failed cases
and doesn't save <irq> on request_irq() failure.

Question: why are some error conditions in applicom_init()
handled by "return -EIO" and others handled by "continue"?

Comments?

Thanks,
--
~Randy


patch_name: applicom_leak.patch
patch_version: 2003-09-17.11:06:35
author: Randy.Dunlap <rddunlap@xxxxxxxx>
description: fix ioremap() leak and #warning;
unwind init on errors;
don't save irq on request_irq() failure;
product: Linux
product_versions: 2.6.0-test5
maintainer: David Woodhouse (dwmw2@xxxxxxxxxxxxx)
diffstat: =
drivers/char/applicom.c | 15 ++++++++++-----
1 files changed, 10 insertions(+), 5 deletions(-)


diff -Naurp ./drivers/char/applicom.c~appleak ./drivers/char/applicom.c
--- ./drivers/char/applicom.c~appleak 2003-09-08 12:50:29.000000000 -0700
+++ ./drivers/char/applicom.c 2003-09-17 11:06:01.000000000 -0700
@@ -192,7 +192,7 @@ int __init applicom_init(void)
{
int i, numisa = 0;
struct pci_dev *dev = NULL;
- void *RamIO;
+ void *RamIO, *maxRamIO;
int boardno;

printk(KERN_INFO "Applicom driver: $Id: ac.c,v 1.30 2000/03/22 16:03:57 dwmw2 Exp $\n");
@@ -214,6 +214,7 @@ int __init applicom_init(void)

if (!RamIO) {
printk(KERN_INFO "ac.o: Failed to ioremap PCI memory space at 0x%lx\n", dev->resource[0].start);
+ pci_disable_device(dev);
return -EIO;
}

@@ -225,12 +226,14 @@ int __init applicom_init(void)
(unsigned long)RamIO,0))) {
printk(KERN_INFO "ac.o: PCI Applicom device doesn't have correct signature.\n");
iounmap(RamIO);
+ pci_disable_device(dev);
continue;
}

if (request_irq(dev->irq, &ac_interrupt, SA_SHIRQ, "Applicom PCI", &dummy)) {
printk(KERN_INFO "Could not allocate IRQ %d for PCI Applicom device.\n", dev->irq);
iounmap(RamIO);
+ pci_disable_device(dev);
apbs[boardno - 1].RamIO = 0;
continue;
}
@@ -257,10 +260,9 @@ int __init applicom_init(void)

/* Now try the specified ISA cards */

-#warning "LEAK"
- RamIO = ioremap(mem, LEN_RAM_IO * MAX_ISA_BOARD);
+ maxRamIO = ioremap(mem, LEN_RAM_IO * MAX_ISA_BOARD);

- if (!RamIO)
+ if (!maxRamIO)
printk(KERN_INFO "ac.o: Failed to ioremap ISA memory space at 0x%lx\n", mem);

for (i = 0; i < MAX_ISA_BOARD; i++) {
@@ -285,7 +287,8 @@ int __init applicom_init(void)
iounmap((void *) RamIO);
apbs[boardno - 1].RamIO = 0;
}
- apbs[boardno - 1].irq = irq;
+ else
+ apbs[boardno - 1].irq = irq;
}
else
apbs[boardno - 1].irq = 0;
@@ -296,6 +299,8 @@ int __init applicom_init(void)
if (!numisa)
printk(KERN_WARNING"ac.o: No valid ISA Applicom boards found at mem 0x%lx\n",mem);

+ iounmap(maxRamIO);
+
fin:
init_waitqueue_head(&FlagSleepRec);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/