]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtl818x: Fix potential memory leaks in rtl8180_init_rx_ring()
authorAbdun Nihaal <nihaal@cse.iitm.ac.in>
Fri, 14 Nov 2025 09:45:26 +0000 (15:15 +0530)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 18 Nov 2025 02:29:49 +0000 (10:29 +0800)
In rtl8180_init_rx_ring(), memory is allocated for skb packets and DMA
allocations in a loop. When an allocation fails, the previously
successful allocations are not freed on exit.

Fix that by jumping to err_free_rings label on error, which calls
rtl8180_free_rx_ring() to free the allocations. Remove the free of
rx_ring in rtl8180_init_rx_ring() error path, and set the freed
priv->rx_buf entry to null, to avoid double free.

Fixes: f653211197f3 ("Add rtl8180 wireless driver")
Signed-off-by: Abdun Nihaal <nihaal@cse.iitm.ac.in>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20251114094527.79842-1-nihaal@cse.iitm.ac.in
drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c

index 2905baea62390df0979c87045a2334042e03c710..070c0431c4821c6ad65f9b46dd7abd7280ebfe50 100644 (file)
@@ -1023,9 +1023,6 @@ static int rtl8180_init_rx_ring(struct ieee80211_hw *dev)
                dma_addr_t *mapping;
                entry = priv->rx_ring + priv->rx_ring_sz*i;
                if (!skb) {
-                       dma_free_coherent(&priv->pdev->dev,
-                                         priv->rx_ring_sz * 32,
-                                         priv->rx_ring, priv->rx_ring_dma);
                        wiphy_err(dev->wiphy, "Cannot allocate RX skb\n");
                        return -ENOMEM;
                }
@@ -1037,9 +1034,7 @@ static int rtl8180_init_rx_ring(struct ieee80211_hw *dev)
 
                if (dma_mapping_error(&priv->pdev->dev, *mapping)) {
                        kfree_skb(skb);
-                       dma_free_coherent(&priv->pdev->dev,
-                                         priv->rx_ring_sz * 32,
-                                         priv->rx_ring, priv->rx_ring_dma);
+                       priv->rx_buf[i] = NULL;
                        wiphy_err(dev->wiphy, "Cannot map DMA for RX skb\n");
                        return -ENOMEM;
                }
@@ -1130,7 +1125,7 @@ static int rtl8180_start(struct ieee80211_hw *dev)
 
        ret = rtl8180_init_rx_ring(dev);
        if (ret)
-               return ret;
+               goto err_free_rings;
 
        for (i = 0; i < (dev->queues + 1); i++)
                if ((ret = rtl8180_init_tx_ring(dev, i, 16)))