mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
wifi: rtl818x: Fix potential memory leaks in rtl8180_init_rx_ring()
[ Upstream commit 9b5b9c042b30befc5b37e4539ace95af70843473 ]
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: f653211197 ("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
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5ed033c541
commit
bf8513dfa3
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user