]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
rtl8xxxu: prevent potential memory leak
authorChris Chiu <chiu@endlessm.com>
Sun, 6 Sep 2020 04:04:24 +0000 (12:04 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Oct 2020 08:03:10 +0000 (09:03 +0100)
[ Upstream commit 86279456a4d47782398d3cb8193f78f672e36cac ]

Free the skb if usb_submit_urb fails on rx_urb. And free the urb
no matter usb_submit_urb succeeds or not in rtl8xxxu_submit_int_urb.

Signed-off-by: Chris Chiu <chiu@endlessm.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200906040424.22022-1-chiu@endlessm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c

index 8254d4b22c50b6be7a60e57701914131ade0dddb..b8d387edde65c4280e57af9c6b10bb6828cb7567 100644 (file)
@@ -5135,7 +5135,6 @@ static int rtl8xxxu_submit_int_urb(struct ieee80211_hw *hw)
        ret = usb_submit_urb(urb, GFP_KERNEL);
        if (ret) {
                usb_unanchor_urb(urb);
-               usb_free_urb(urb);
                goto error;
        }
 
@@ -5144,6 +5143,7 @@ static int rtl8xxxu_submit_int_urb(struct ieee80211_hw *hw)
        rtl8xxxu_write32(priv, REG_USB_HIMR, val32);
 
 error:
+       usb_free_urb(urb);
        return ret;
 }
 
@@ -5424,6 +5424,7 @@ static int rtl8xxxu_start(struct ieee80211_hw *hw)
        struct rtl8xxxu_priv *priv = hw->priv;
        struct rtl8xxxu_rx_urb *rx_urb;
        struct rtl8xxxu_tx_urb *tx_urb;
+       struct sk_buff *skb;
        unsigned long flags;
        int ret, i;
 
@@ -5472,6 +5473,13 @@ static int rtl8xxxu_start(struct ieee80211_hw *hw)
                rx_urb->hw = hw;
 
                ret = rtl8xxxu_submit_rx_urb(priv, rx_urb);
+               if (ret) {
+                       if (ret != -ENOMEM) {
+                               skb = (struct sk_buff *)rx_urb->urb.context;
+                               dev_kfree_skb(skb);
+                       }
+                       rtl8xxxu_queue_rx_urb(priv, rx_urb);
+               }
        }
 exit:
        /*