]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtlwifi: fix possible skb memory leak in `_rtl_pci_rx_interrupt()`.
authorThomas Fourier <fourier.thomas@gmail.com>
Mon, 16 Jun 2025 10:56:30 +0000 (12:56 +0200)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 24 Jun 2025 07:22:58 +0000 (15:22 +0800)
The function `_rtl_pci_init_one_rxdesc()` can fail even when the new
`skb` is passed because of a DMA mapping error.  If it fails, the `skb`
is not saved in the rx ringbuffer and thus lost.

Compile tested only

Signed-off-by: Thomas Fourier <fourier.thomas@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250616105631.444309-4-fourier.thomas@gmail.com
drivers/net/wireless/realtek/rtlwifi/pci.c

index 472072630f8d45e0f80dec96f45e63276796c208..d080469264cf89eb96cf75304c946d2388421586 100644 (file)
@@ -805,13 +805,19 @@ new_trx_end:
                skb = new_skb;
 no_new:
                if (rtlpriv->use_new_trx_flow) {
-                       _rtl_pci_init_one_rxdesc(hw, skb, (u8 *)buffer_desc,
-                                                rxring_idx,
-                                                rtlpci->rx_ring[rxring_idx].idx);
+                       if (!_rtl_pci_init_one_rxdesc(hw, skb, (u8 *)buffer_desc,
+                                                     rxring_idx,
+                                                     rtlpci->rx_ring[rxring_idx].idx)) {
+                               if (new_skb)
+                                       dev_kfree_skb_any(skb);
+                       }
                } else {
-                       _rtl_pci_init_one_rxdesc(hw, skb, (u8 *)pdesc,
-                                                rxring_idx,
-                                                rtlpci->rx_ring[rxring_idx].idx);
+                       if (!_rtl_pci_init_one_rxdesc(hw, skb, (u8 *)pdesc,
+                                                     rxring_idx,
+                                                     rtlpci->rx_ring[rxring_idx].idx)) {
+                               if (new_skb)
+                                       dev_kfree_skb_any(skb);
+                       }
                        if (rtlpci->rx_ring[rxring_idx].idx ==
                            rtlpci->rxringcount - 1)
                                rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc,