mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH net] net: macb: fix dma_alloc_coherent() leak on macb_alloc() error paths
@ 2026-09-18 19:53 Théo Lebrun
  2026-09-18 20:10 ` Nicolai Buchwitz
  0 siblings, 1 reply; 2+ messages in thread
From: Théo Lebrun @ 2026-09-18 19:53 UTC (permalink / raw)
  To: Conor Dooley, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, Simon Horman, Nicolas Ferre,
	Sean Anderson
  Cc: netdev, linux-kernel, Nicolai Buchwitz, Vladimir Kondratiev,
	Gregory CLEMENT, Tawfik Bayouk, Thomas Petazzoni, stable,
	Théo Lebrun

Fix 3 leaks in macb_alloc() error paths:
- Tx buffer allocated but crossing a 4G boundary: Tx leaked.
- Rx buffer allocation fails: Tx leaked.
- Rx buffer allocated but crossing a 4G boundary: Tx & Rx leaked.

This is because our error handling calls macb_free(bp) which in turn
frees the buffers stored in bp->queues[0], but nothing has been stored
in there. Fix by storing allocated buffers into bp->queues[0] ASAP.

Fixes: 78d901897b3c ("net: macb: single dma_alloc_coherent() for DMA descriptors")
Cc: stable@vger.kernel.org
Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
---
 drivers/net/ethernet/cadence/macb_main.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
index b8234ac4b602..8e5c034dc3a4 100644
--- a/drivers/net/ethernet/cadence/macb_main.c
+++ b/drivers/net/ethernet/cadence/macb_main.c
@@ -2749,14 +2749,24 @@ static int macb_alloc(struct macb *bp)
 
 	size = bp->num_queues * macb_tx_ring_size_per_queue(bp);
 	tx = dma_alloc_coherent(dev, size, &tx_dma, GFP_KERNEL);
-	if (!tx || upper_32_bits(tx_dma) != upper_32_bits(tx_dma + size - 1))
+	if (!tx)
+		goto out_err;
+	/* Record the buffer so that the error path frees it. */
+	bp->queues[0].tx_ring = tx;
+	bp->queues[0].tx_ring_dma = tx_dma;
+	if (upper_32_bits(tx_dma) != upper_32_bits(tx_dma + size - 1))
 		goto out_err;
 	netdev_dbg(bp->netdev, "Allocated %zu bytes for %u TX rings at %08lx (mapped %p)\n",
 		   size, bp->num_queues, (unsigned long)tx_dma, tx);
 
 	size = bp->num_queues * macb_rx_ring_size_per_queue(bp);
 	rx = dma_alloc_coherent(dev, size, &rx_dma, GFP_KERNEL);
-	if (!rx || upper_32_bits(rx_dma) != upper_32_bits(rx_dma + size - 1))
+	if (!rx)
+		goto out_err;
+	/* Record the buffer so that the error path frees it. */
+	bp->queues[0].rx_ring = rx;
+	bp->queues[0].rx_ring_dma = rx_dma;
+	if (upper_32_bits(rx_dma) != upper_32_bits(rx_dma + size - 1))
 		goto out_err;
 	netdev_dbg(bp->netdev, "Allocated %zu bytes for %u RX rings at %08lx (mapped %p)\n",
 		   size, bp->num_queues, (unsigned long)rx_dma, rx);

---
base-commit: 994db8ab9d90c64dd641b7ead6efe2eaea7a50dc
change-id: 20260918-macb-alloc-leak-ef38989605c7

Best regards,
--  
Théo Lebrun <theo.lebrun@bootlin.com>


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH net] net: macb: fix dma_alloc_coherent() leak on macb_alloc() error paths
  2026-09-18 19:53 [PATCH net] net: macb: fix dma_alloc_coherent() leak on macb_alloc() error paths Théo Lebrun
@ 2026-09-18 20:10 ` Nicolai Buchwitz
  0 siblings, 0 replies; 2+ messages in thread
From: Nicolai Buchwitz @ 2026-09-18 20:10 UTC (permalink / raw)
  To: Théo Lebrun
  Cc: Conor Dooley, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, Simon Horman, Nicolas Ferre,
	Sean Anderson, netdev, linux-kernel, Vladimir Kondratiev,
	Gregory CLEMENT, Tawfik Bayouk, Thomas Petazzoni, stable

Hi Théo

On 18.9.2026 21:53, Théo Lebrun wrote:
> Fix 3 leaks in macb_alloc() error paths:
> - Tx buffer allocated but crossing a 4G boundary: Tx leaked.
> - Rx buffer allocation fails: Tx leaked.
> - Rx buffer allocated but crossing a 4G boundary: Tx & Rx leaked.
> 
> This is because our error handling calls macb_free(bp) which in turn
> frees the buffers stored in bp->queues[0], but nothing has been stored
> in there. Fix by storing allocated buffers into bp->queues[0] ASAP.
> 
> Fixes: 78d901897b3c ("net: macb: single dma_alloc_coherent() for DMA 
> descriptors")
> Cc: stable@vger.kernel.org
> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
> ---
>  drivers/net/ethernet/cadence/macb_main.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/cadence/macb_main.c 
> b/drivers/net/ethernet/cadence/macb_main.c
> index b8234ac4b602..8e5c034dc3a4 100644
> --- a/drivers/net/ethernet/cadence/macb_main.c
> +++ b/drivers/net/ethernet/cadence/macb_main.c
> @@ -2749,14 +2749,24 @@ static int macb_alloc(struct macb *bp)
> 
>  	size = bp->num_queues * macb_tx_ring_size_per_queue(bp);
>  	tx = dma_alloc_coherent(dev, size, &tx_dma, GFP_KERNEL);
> -	if (!tx || upper_32_bits(tx_dma) != upper_32_bits(tx_dma + size - 1))
> +	if (!tx)
> +		goto out_err;
> +	/* Record the buffer so that the error path frees it. */
> +	bp->queues[0].tx_ring = tx;
> +	bp->queues[0].tx_ring_dma = tx_dma;
> +	if (upper_32_bits(tx_dma) != upper_32_bits(tx_dma + size - 1))
>  		goto out_err;
>  	netdev_dbg(bp->netdev, "Allocated %zu bytes for %u TX rings at %08lx 
> (mapped %p)\n",
>  		   size, bp->num_queues, (unsigned long)tx_dma, tx);
> 
>  	size = bp->num_queues * macb_rx_ring_size_per_queue(bp);
>  	rx = dma_alloc_coherent(dev, size, &rx_dma, GFP_KERNEL);
> -	if (!rx || upper_32_bits(rx_dma) != upper_32_bits(rx_dma + size - 1))
> +	if (!rx)
> +		goto out_err;
> +	/* Record the buffer so that the error path frees it. */
> +	bp->queues[0].rx_ring = rx;
> +	bp->queues[0].rx_ring_dma = rx_dma;
> +	if (upper_32_bits(rx_dma) != upper_32_bits(rx_dma + size - 1))
>  		goto out_err;
>  	netdev_dbg(bp->netdev, "Allocated %zu bytes for %u RX rings at %08lx 
> (mapped %p)\n",
>  		   size, bp->num_queues, (unsigned long)rx_dma, rx);
> 
> ---
> base-commit: 994db8ab9d90c64dd641b7ead6efe2eaea7a50dc
> change-id: 20260918-macb-alloc-leak-ef38989605c7
> 
> Best regards,
> --
> Théo Lebrun <theo.lebrun@bootlin.com>

Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de>

Thanks,
Nicolai

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-09-18 20:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-18 19:53 [PATCH net] net: macb: fix dma_alloc_coherent() leak on macb_alloc() error paths Théo Lebrun
2026-09-18 20:10 ` Nicolai Buchwitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®