OSDN Git Service

wifi: mt76: mt7915: fix memory leak in mt7915_mmio_wed_init_rx_buf
authorLorenzo Bianconi <lorenzo@kernel.org>
Tue, 17 Jan 2023 13:53:14 +0000 (14:53 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 3 Feb 2023 13:47:17 +0000 (14:47 +0100)
Free mt76_txwi_cache pointer in mt7915_mmio_wed_init_rx_buf routine in
case of failure.

Fixes: 4f831d18d12d ("wifi: mt76: mt7915: enable WED RX support")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c

index b9e8cfd..65b5f3c 100644 (file)
@@ -635,9 +635,14 @@ static u32 mt7915_mmio_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
                int token;
                void *ptr;
 
+               if (!t)
+                       goto unmap;
+
                page = __dev_alloc_pages(GFP_KERNEL, get_order(length));
-               if (!page)
+               if (!page) {
+                       mt76_put_rxwi(&dev->mt76, t);
                        goto unmap;
+               }
 
                ptr = page_address(page);
                phy_addr = dma_map_single(dev->mt76.dma_dev, ptr,
@@ -645,6 +650,7 @@ static u32 mt7915_mmio_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
                                          DMA_TO_DEVICE);
                if (unlikely(dma_mapping_error(dev->mt76.dev, phy_addr))) {
                        __free_pages(page, get_order(length));
+                       mt76_put_rxwi(&dev->mt76, t);
                        goto unmap;
                }
 
@@ -654,6 +660,7 @@ static u32 mt7915_mmio_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
                        dma_unmap_single(dev->mt76.dma_dev, phy_addr,
                                         wed->wlan.rx_size, DMA_TO_DEVICE);
                        __free_pages(page, get_order(length));
+                       mt76_put_rxwi(&dev->mt76, t);
                        goto unmap;
                }