igbvf: Check for error on dma_map_single call
authorGreg Rose <gregory.v.rose@intel.com>
Fri, 21 Sep 2012 00:21:39 +0000 (00:21 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 30 Oct 2012 06:48:58 +0000 (23:48 -0700)
Ignoring the return value from a call to the kernel dma_map API functions
can cause data corruption and system instability.  Check the return value
and take appropriate action.

Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Tested-by: Sibai Li <sibai.li@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/igbvf/netdev.c

index 0ac11f527a84e289d8d42f693c7ebeff67e198a7..4051ec404613c4788485f58125f9d76888a1dc69 100644 (file)
@@ -184,6 +184,13 @@ static void igbvf_alloc_rx_buffers(struct igbvf_ring *rx_ring,
                                             buffer_info->page_offset,
                                             PAGE_SIZE / 2,
                                             DMA_FROM_DEVICE);
+                       if (dma_mapping_error(&pdev->dev,
+                                             buffer_info->page_dma)) {
+                               __free_page(buffer_info->page);
+                               buffer_info->page = NULL;
+                               dev_err(&pdev->dev, "RX DMA map failed\n");
+                               break;
+                       }
                }
 
                if (!buffer_info->skb) {
@@ -197,6 +204,12 @@ static void igbvf_alloc_rx_buffers(struct igbvf_ring *rx_ring,
                        buffer_info->dma = dma_map_single(&pdev->dev, skb->data,
                                                          bufsz,
                                                          DMA_FROM_DEVICE);
+                       if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
+                               dev_kfree_skb(buffer_info->skb);
+                               buffer_info->skb = NULL;
+                               dev_err(&pdev->dev, "RX DMA map failed\n");
+                               goto no_buffers;
+                       }
                }
                /* Refresh the desc even if buffer_addrs didn't change because
                 * each write-back erases this info. */