3c59x: Fix resource leaks in vortex_open

When vortex_up is failed, the skb buffers allocated by __netdev_alloc_skb
in vortex_open are not released, which may cause resource leaks.
This bug has been submitted before.
This patch modifies the error handling code to fix it.

Signed-off-by: Jia-Ju Bai <baijiaju1990@163.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jia-Ju Bai 2015-08-03 11:18:12 +08:00 коммит произвёл David S. Miller
Родитель 468b732b6f
Коммит 2fc09962e2
1 изменённых файлов: 8 добавлений и 9 удалений

Просмотреть файл

@ -1763,16 +1763,9 @@ vortex_open(struct net_device *dev)
vp->rx_ring[i].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, PKT_BUF_SZ, PCI_DMA_FROMDEVICE)); vp->rx_ring[i].addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, PKT_BUF_SZ, PCI_DMA_FROMDEVICE));
} }
if (i != RX_RING_SIZE) { if (i != RX_RING_SIZE) {
int j;
pr_emerg("%s: no memory for rx ring\n", dev->name); pr_emerg("%s: no memory for rx ring\n", dev->name);
for (j = 0; j < i; j++) {
if (vp->rx_skbuff[j]) {
dev_kfree_skb(vp->rx_skbuff[j]);
vp->rx_skbuff[j] = NULL;
}
}
retval = -ENOMEM; retval = -ENOMEM;
goto err_free_irq; goto err_free_skb;
} }
/* Wrap the ring. */ /* Wrap the ring. */
vp->rx_ring[i-1].next = cpu_to_le32(vp->rx_ring_dma); vp->rx_ring[i-1].next = cpu_to_le32(vp->rx_ring_dma);
@ -1782,7 +1775,13 @@ vortex_open(struct net_device *dev)
if (!retval) if (!retval)
goto out; goto out;
err_free_irq: err_free_skb:
for (i = 0; i < RX_RING_SIZE; i++) {
if (vp->rx_skbuff[i]) {
dev_kfree_skb(vp->rx_skbuff[i]);
vp->rx_skbuff[i] = NULL;
}
}
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
err: err:
if (vortex_debug > 1) if (vortex_debug > 1)