Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: dlink: handle dma_map_single() failure properly

There is no error handling for `dma_map_single()` failures.

Add error handling by checking `dma_mapping_error()` and freeing
the `skb` using `dev_kfree_skb()` (process context) when it fails.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Yeounsu Moon <yyyynoom@gmail.com>
Tested-on: D-Link DGE-550T Rev-A3
Suggested-by: Simon Horman <horms@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Yeounsu Moon and committed by
David S. Miller
65946eac 3abc0e55

+16 -7
+16 -7
drivers/net/ethernet/dlink/dl2k.c
··· 508 508 for (i = 0; i < RX_RING_SIZE; i++) { 509 509 /* Allocated fixed size of skbuff */ 510 510 struct sk_buff *skb; 511 + dma_addr_t addr; 511 512 512 513 skb = netdev_alloc_skb_ip_align(dev, np->rx_buf_sz); 513 514 np->rx_skbuff[i] = skb; 514 - if (!skb) { 515 - free_list(dev); 516 - return -ENOMEM; 517 - } 515 + if (!skb) 516 + goto err_free_list; 517 + 518 + addr = dma_map_single(&np->pdev->dev, skb->data, 519 + np->rx_buf_sz, DMA_FROM_DEVICE); 520 + if (dma_mapping_error(&np->pdev->dev, addr)) 521 + goto err_kfree_skb; 518 522 519 523 np->rx_ring[i].next_desc = cpu_to_le64(np->rx_ring_dma + 520 524 ((i + 1) % RX_RING_SIZE) * 521 525 sizeof(struct netdev_desc)); 522 526 /* Rubicon now supports 40 bits of addressing space. */ 523 - np->rx_ring[i].fraginfo = 524 - cpu_to_le64(dma_map_single(&np->pdev->dev, skb->data, 525 - np->rx_buf_sz, DMA_FROM_DEVICE)); 527 + np->rx_ring[i].fraginfo = cpu_to_le64(addr); 526 528 np->rx_ring[i].fraginfo |= cpu_to_le64((u64)np->rx_buf_sz << 48); 527 529 } 528 530 529 531 return 0; 532 + 533 + err_kfree_skb: 534 + dev_kfree_skb(np->rx_skbuff[i]); 535 + np->rx_skbuff[i] = NULL; 536 + err_free_list: 537 + free_list(dev); 538 + return -ENOMEM; 530 539 } 531 540 532 541 static void rio_hw_init(struct net_device *dev)