t3e3_init_channel() incorrectly handles errors in several places:
it returns zero and does not deallocate all required resources.
The patch fixes that places.

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov <khoroshi...@ispras.ru>
---
 drivers/staging/sbe-2t3e3/module.c |   15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/sbe-2t3e3/module.c 
b/drivers/staging/sbe-2t3e3/module.c
index cd778b3..8adb178 100644
--- a/drivers/staging/sbe-2t3e3/module.c
+++ b/drivers/staging/sbe-2t3e3/module.c
@@ -67,6 +67,7 @@ static int __devinit t3e3_init_channel(struct channel 
*channel, struct pci_dev *
        dev = alloc_hdlcdev(channel);
        if (!dev) {
                printk(KERN_ERR "SBE 2T3E3" ": Out of memory\n");
+               err = -ENOMEM;
                goto free_regions;
        }
 
@@ -82,8 +83,9 @@ static int __devinit t3e3_init_channel(struct channel 
*channel, struct pci_dev *
        else
                channel->h.slot = 0;
 
-       if (setup_device(dev, channel))
-               goto free_regions;
+       err = setup_device(dev, channel);
+       if (err)
+               goto free_dev;
 
        pci_read_config_dword(channel->pdev, 0x40, &val); /* mask sleep mode */
        pci_write_config_dword(channel->pdev, 0x40, val & 0x3FFFFFFF);
@@ -92,14 +94,19 @@ static int __devinit t3e3_init_channel(struct channel 
*channel, struct pci_dev *
        pci_read_config_dword(channel->pdev, PCI_COMMAND, &channel->h.command);
        t3e3_init(channel);
 
-       if (request_irq(dev->irq, &t3e3_intr, IRQF_SHARED, dev->name, dev)) {
+       err = request_irq(dev->irq, &t3e3_intr, IRQF_SHARED, dev->name, dev);
+       if (err) {
                printk(KERN_WARNING "%s: could not get irq: %d\n", dev->name, 
dev->irq);
-               goto free_regions;
+               goto unregister_dev;
        }
 
        pci_set_drvdata(pdev, channel);
        return 0;
 
+unregister_dev:
+       unregister_hdlc_device(dev);
+free_dev:
+       free_netdev(dev);
 free_regions:
        pci_release_regions(pdev);
 disable:
-- 
1.7.9.5

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

Reply via email to