rtlwifi: rtl8192cu: Fix deadlock
authorReto Schneider <code@reto-schneider.ch>
Mon, 22 Jun 2020 13:21:11 +0000 (15:21 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 15 Jul 2020 10:37:12 +0000 (13:37 +0300)
Prevent code from calling itself indirectly, causing the driver to hang
and consume 100% CPU.

Without this fix, the following script can bring down a single CPU
system:
```
while true; do
  rmmod rtl8192cu
  modprobe rtl8192cu
done
```

Signed-off-by: Reto Schneider <code@reto-schneider.ch>
ACKed-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200622132113.14508-2-code@reto-schneider.ch
drivers/net/wireless/realtek/rtlwifi/usb.c

index c66c6dc003783a6417c6d3a97553527e553e7d6e..d3bbfc0171f699a063d79dd25bf9fdcdda784975 100644 (file)
@@ -680,8 +680,10 @@ static void _rtl_usb_cleanup_rx(struct ieee80211_hw *hw)
        tasklet_kill(&rtlusb->rx_work_tasklet);
        cancel_work_sync(&rtlpriv->works.lps_change_work);
 
-       flush_workqueue(rtlpriv->works.rtl_wq);
-       destroy_workqueue(rtlpriv->works.rtl_wq);
+       if (rtlpriv->works.rtl_wq) {
+               destroy_workqueue(rtlpriv->works.rtl_wq);
+               rtlpriv->works.rtl_wq = NULL;
+       }
 
        skb_queue_purge(&rtlusb->rx_queue);