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.

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 <fourier.thomas@gmail.com>
Acked-by: Mark Einon <mark.einon@gmail.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250716094733.28734-2-fourier.thomas@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Thomas Fourier and committed by
Jakub Kicinski
d61f6cb6 96a1e15e

+36
+36
drivers/net/ethernet/agere/et131x.c
··· 2459 2459 skb->data, 2460 2460 skb_headlen(skb), 2461 2461 DMA_TO_DEVICE); 2462 + if (dma_mapping_error(&adapter->pdev->dev, 2463 + dma_addr)) 2464 + return -ENOMEM; 2465 + 2462 2466 desc[frag].addr_lo = lower_32_bits(dma_addr); 2463 2467 desc[frag].addr_hi = upper_32_bits(dma_addr); 2464 2468 frag++; ··· 2472 2468 skb->data, 2473 2469 skb_headlen(skb) / 2, 2474 2470 DMA_TO_DEVICE); 2471 + if (dma_mapping_error(&adapter->pdev->dev, 2472 + dma_addr)) 2473 + return -ENOMEM; 2474 + 2475 2475 desc[frag].addr_lo = lower_32_bits(dma_addr); 2476 2476 desc[frag].addr_hi = upper_32_bits(dma_addr); 2477 2477 frag++; ··· 2486 2478 skb_headlen(skb) / 2, 2487 2479 skb_headlen(skb) / 2, 2488 2480 DMA_TO_DEVICE); 2481 + if (dma_mapping_error(&adapter->pdev->dev, 2482 + dma_addr)) 2483 + goto unmap_first_out; 2484 + 2489 2485 desc[frag].addr_lo = lower_32_bits(dma_addr); 2490 2486 desc[frag].addr_hi = upper_32_bits(dma_addr); 2491 2487 frag++; ··· 2501 2489 0, 2502 2490 desc[frag].len_vlan, 2503 2491 DMA_TO_DEVICE); 2492 + if (dma_mapping_error(&adapter->pdev->dev, dma_addr)) 2493 + goto unmap_out; 2494 + 2504 2495 desc[frag].addr_lo = lower_32_bits(dma_addr); 2505 2496 desc[frag].addr_hi = upper_32_bits(dma_addr); 2506 2497 frag++; ··· 2593 2578 &adapter->regs->global.watchdog_timer); 2594 2579 } 2595 2580 return 0; 2581 + 2582 + unmap_out: 2583 + // Unmap the body of the packet with map_page 2584 + while (--i) { 2585 + frag--; 2586 + dma_addr = desc[frag].addr_lo; 2587 + dma_addr |= (u64)desc[frag].addr_hi << 32; 2588 + dma_unmap_page(&adapter->pdev->dev, dma_addr, 2589 + desc[frag].len_vlan, DMA_TO_DEVICE); 2590 + } 2591 + 2592 + unmap_first_out: 2593 + // Unmap the header with map_single 2594 + while (frag--) { 2595 + dma_addr = desc[frag].addr_lo; 2596 + dma_addr |= (u64)desc[frag].addr_hi << 32; 2597 + dma_unmap_single(&adapter->pdev->dev, dma_addr, 2598 + desc[frag].len_vlan, DMA_TO_DEVICE); 2599 + } 2600 + 2601 + return -ENOMEM; 2596 2602 } 2597 2603 2598 2604 static int send_packet(struct sk_buff *skb, struct et131x_adapter *adapter)