aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinas Vepstas <linas@austin.ibm.com>2006-12-13 15:15:15 -0600
committerJeff Garzik <jeff@garzik.org>2007-02-05 16:58:44 -0500
commit05b346b552e13cc090ea908e2be183b377ff30a2 (patch)
tree2ff85c154bc808f6567f014e0b57df9bf0591e37
parent1cd173f66c392ede57fa10f614fca22d79501424 (diff)
Spidernet RX skb mem leak
One of the unlikely error branches has an skb memory leak. Fix this by handling the error conditions consistently. Signed-off-by: Linas Vepstas <linas@austin.ibm.com> Cc: James K Lewis <jklewis@us.ibm.com> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/net/spider_net.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c
index f97251a9c85..f1cd13fbd5c 100644
--- a/drivers/net/spider_net.c
+++ b/drivers/net/spider_net.c
@@ -913,8 +913,8 @@ spider_net_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
*
* returns 1 on success, 0 if no packet was passed to the stack
*
- * iommu-unmaps the skb, fills out skb structure and passes the data to the
- * stack. The descriptor state is not changed.
+ * Fills out skb structure and passes the data to the stack.
+ * The descriptor state is not changed.
*/
static int
spider_net_pass_skb_up(struct spider_net_descr *descr,
@@ -929,10 +929,6 @@ spider_net_pass_skb_up(struct spider_net_descr *descr,
netdev = card->netdev;
- /* unmap descriptor */
- pci_unmap_single(card->pdev, descr->buf_addr, SPIDER_NET_MAX_FRAME,
- PCI_DMA_FROMDEVICE);
-
/* the cases we'll throw away the packet immediately */
if (data_error & SPIDER_NET_DESTROY_RX_FLAGS) {
if (netif_msg_rx_err(card))
@@ -1015,6 +1011,11 @@ spider_net_decode_one_descr(struct spider_net_card *card)
chain->tail = descr->next;
result = 0;
+
+ /* unmap descriptor */
+ pci_unmap_single(card->pdev, descr->buf_addr,
+ SPIDER_NET_MAX_FRAME, PCI_DMA_FROMDEVICE);
+
if ( (status == SPIDER_NET_DESCR_RESPONSE_ERROR) ||
(status == SPIDER_NET_DESCR_PROTECTION_ERROR) ||
(status == SPIDER_NET_DESCR_FORCE_END) ) {
@@ -1022,8 +1023,6 @@ spider_net_decode_one_descr(struct spider_net_card *card)
pr_err("%s: dropping RX descriptor with state %d\n",
card->netdev->name, status);
card->netdev_stats.rx_dropped++;
- pci_unmap_single(card->pdev, descr->buf_addr,
- SPIDER_NET_MAX_FRAME, PCI_DMA_FROMDEVICE);
dev_kfree_skb_irq(descr->skb);
goto refill;
}
@@ -1031,9 +1030,10 @@ spider_net_decode_one_descr(struct spider_net_card *card)
if ( (status != SPIDER_NET_DESCR_COMPLETE) &&
(status != SPIDER_NET_DESCR_FRAME_END) ) {
if (netif_msg_rx_err(card))
- pr_err("%s: RX descriptor with state %d\n",
+ pr_err("%s: RX descriptor with unkown state %d\n",
card->netdev->name, status);
card->spider_stats.rx_desc_unk_state++;
+ dev_kfree_skb_irq(descr->skb);
goto refill;
}