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:
Родитель
468b732b6f
Коммит
2fc09962e2
|
@ -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)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче