Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] [patch 2.6.10-rc3-mm1 1/5] skystar2: PCI api update + leaks



PCI api update + leaks
- claim_adapter:
  + s/request_xxx_region/pci_request_region/
  + plug leaks on error path (requested io regions and enabled pci device);
  + propagate the status code;
- driver_halt:
  + missing pci_disable_device();
  + s/release_xxx_region/pci_release_region/
- driver_initialize:
  + s/release_xxx_region/pci_release_region/

Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>

diff -puN drivers/media/dvb/b2c2/skystar2.c~dvb-010 drivers/media/dvb/b2c2/skystar2.c
--- linux-2.6.10-rc3/drivers/media/dvb/b2c2/skystar2.c~dvb-010	2004-12-14 23:27:52.657999830 +0100
+++ linux-2.6.10-rc3-romieu/drivers/media/dvb/b2c2/skystar2.c	2004-12-15 01:20:29.986235397 +0100
@@ -1784,21 +1784,24 @@ static struct pci_driver skystar2_pci_dr
 static int claim_adapter(struct adapter *adapter)
 {
 	struct pci_dev *pdev = adapter->pdev;
-
 	u16 var;
+	int ret;
 
-	if (!request_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1), skystar2_pci_driver.name))
-		return -EBUSY;
+	ret = pci_request_region(pdev, 1, skystar2_pci_driver.name);
+	if (ret < 0)
+		goto out;
 
-	if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), skystar2_pci_driver.name))
-		return -EBUSY;
+	ret = pci_request_region(pdev, 0, skystar2_pci_driver.name);
+	if (ret < 0)
+		goto err_pci_release_1;
 
 	pci_read_config_byte(pdev, PCI_CLASS_REVISION, &adapter->card_revision);
 
 	dprintk("%s: card revision %x \n", __FUNCTION__, adapter->card_revision);
 
-	if (pci_enable_device(pdev))
-		return -EIO;
+	ret = pci_enable_device(pdev);
+	if (ret < 0)
+		goto err_pci_release_0;
 
 	pci_read_config_word(pdev, 4, &var);
 
@@ -1811,13 +1814,23 @@ static int claim_adapter(struct adapter 
 
 	if (!adapter->io_mem) {
 		dprintk("%s: can not map io memory\n", __FUNCTION__);
-
-		return 2;
+		ret = -EIO;
+		goto err_pci_disable;
 	}
 
 	dprintk("%s: io memory maped at %p\n", __FUNCTION__, adapter->io_mem);
 
-	return 1;
+	ret = 1;
+out:
+	return ret;
+
+err_pci_disable:
+	pci_disable_device(pdev);
+err_pci_release_0:
+	pci_release_region(pdev, 0);
+err_pci_release_1:
+	pci_release_region(pdev, 1);
+	goto out;
 }
 
 /*
@@ -1933,8 +1946,8 @@ static int driver_initialize(struct pci_
 		printk("%s: This driver works only with FlexCopII(rev.130), FlexCopIIB(rev.195) and FlexCopIII(rev.192).\n", __FILE__);
 		free_adapter_object(adapter);
 		pci_set_drvdata(pdev, NULL);
-		release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
-		release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
+		pci_release_region(pdev, 1);
+		pci_release_region(pdev, 0);
 			return -ENODEV;
 		}
 
@@ -1998,9 +2011,9 @@ static void driver_halt(struct pci_dev *
 
 	pci_set_drvdata(pdev, NULL);
 
-	release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
-
-	release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
+	pci_disable_device(pdev);
+	pci_release_region(pdev, 1);
+	pci_release_region(pdev, 0);
 }
 
 static int dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)

_




Home | Main Index | Thread Index