Skip to content

Commit d61f6cb

Browse files
Thomas-fourierkuba-moo
authored andcommitted
et131x: Add missing check after DMA map
The DMA map functions can fail and should be tested for errors. If the mapping fails, unmap and return an error. Signed-off-by: Thomas Fourier <[email protected]> Acked-by: Mark Einon <[email protected]> Reviewed-by: Simon Horman <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 96a1e15 commit d61f6cb

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

drivers/net/ethernet/agere/et131x.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2459,6 +2459,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
24592459
skb->data,
24602460
skb_headlen(skb),
24612461
DMA_TO_DEVICE);
2462+
if (dma_mapping_error(&adapter->pdev->dev,
2463+
dma_addr))
2464+
return -ENOMEM;
2465+
24622466
desc[frag].addr_lo = lower_32_bits(dma_addr);
24632467
desc[frag].addr_hi = upper_32_bits(dma_addr);
24642468
frag++;
@@ -2468,6 +2472,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
24682472
skb->data,
24692473
skb_headlen(skb) / 2,
24702474
DMA_TO_DEVICE);
2475+
if (dma_mapping_error(&adapter->pdev->dev,
2476+
dma_addr))
2477+
return -ENOMEM;
2478+
24712479
desc[frag].addr_lo = lower_32_bits(dma_addr);
24722480
desc[frag].addr_hi = upper_32_bits(dma_addr);
24732481
frag++;
@@ -2478,6 +2486,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
24782486
skb_headlen(skb) / 2,
24792487
skb_headlen(skb) / 2,
24802488
DMA_TO_DEVICE);
2489+
if (dma_mapping_error(&adapter->pdev->dev,
2490+
dma_addr))
2491+
goto unmap_first_out;
2492+
24812493
desc[frag].addr_lo = lower_32_bits(dma_addr);
24822494
desc[frag].addr_hi = upper_32_bits(dma_addr);
24832495
frag++;
@@ -2489,6 +2501,9 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
24892501
0,
24902502
desc[frag].len_vlan,
24912503
DMA_TO_DEVICE);
2504+
if (dma_mapping_error(&adapter->pdev->dev, dma_addr))
2505+
goto unmap_out;
2506+
24922507
desc[frag].addr_lo = lower_32_bits(dma_addr);
24932508
desc[frag].addr_hi = upper_32_bits(dma_addr);
24942509
frag++;
@@ -2578,6 +2593,27 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
25782593
&adapter->regs->global.watchdog_timer);
25792594
}
25802595
return 0;
2596+
2597+
unmap_out:
2598+
// Unmap the body of the packet with map_page
2599+
while (--i) {
2600+
frag--;
2601+
dma_addr = desc[frag].addr_lo;
2602+
dma_addr |= (u64)desc[frag].addr_hi << 32;
2603+
dma_unmap_page(&adapter->pdev->dev, dma_addr,
2604+
desc[frag].len_vlan, DMA_TO_DEVICE);
2605+
}
2606+
2607+
unmap_first_out:
2608+
// Unmap the header with map_single
2609+
while (frag--) {
2610+
dma_addr = desc[frag].addr_lo;
2611+
dma_addr |= (u64)desc[frag].addr_hi << 32;
2612+
dma_unmap_single(&adapter->pdev->dev, dma_addr,
2613+
desc[frag].len_vlan, DMA_TO_DEVICE);
2614+
}
2615+
2616+
return -ENOMEM;
25812617
}
25822618

25832619
static int send_packet(struct sk_buff *skb, struct et131x_adapter *adapter)

0 commit comments

Comments
 (0)