Commit 4c229df0 authored by Alexey Khoroshilov's avatar Alexey Khoroshilov Committed by Greg Kroah-Hartman

staging: sbe-2t3e3: fix error handling in t3e3_init_channel()

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: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
Reviewed-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 62fea8c8
...@@ -67,6 +67,7 @@ static int __devinit t3e3_init_channel(struct channel *channel, struct pci_dev * ...@@ -67,6 +67,7 @@ static int __devinit t3e3_init_channel(struct channel *channel, struct pci_dev *
dev = alloc_hdlcdev(channel); dev = alloc_hdlcdev(channel);
if (!dev) { if (!dev) {
printk(KERN_ERR "SBE 2T3E3" ": Out of memory\n"); printk(KERN_ERR "SBE 2T3E3" ": Out of memory\n");
err = -ENOMEM;
goto free_regions; goto free_regions;
} }
...@@ -82,8 +83,9 @@ static int __devinit t3e3_init_channel(struct channel *channel, struct pci_dev * ...@@ -82,8 +83,9 @@ static int __devinit t3e3_init_channel(struct channel *channel, struct pci_dev *
else else
channel->h.slot = 0; channel->h.slot = 0;
if (setup_device(dev, channel)) err = setup_device(dev, channel);
goto free_regions; if (err)
goto free_dev;
pci_read_config_dword(channel->pdev, 0x40, &val); /* mask sleep mode */ pci_read_config_dword(channel->pdev, 0x40, &val); /* mask sleep mode */
pci_write_config_dword(channel->pdev, 0x40, val & 0x3FFFFFFF); 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 * ...@@ -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); pci_read_config_dword(channel->pdev, PCI_COMMAND, &channel->h.command);
t3e3_init(channel); 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); 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); pci_set_drvdata(pdev, channel);
return 0; return 0;
unregister_dev:
unregister_hdlc_device(dev);
free_dev:
free_netdev(dev);
free_regions: free_regions:
pci_release_regions(pdev); pci_release_regions(pdev);
disable: disable:
......
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