staging: rtl8188eu: use safe iterator in rtw_free_network_queue
authorMartin Kaiser <martin@kaiser.cx>
Mon, 17 May 2021 20:18:21 +0000 (22:18 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 May 2021 15:54:50 +0000 (17:54 +0200)
rtw_free_network_queue iterates over the scanned wireless networks and
calls _rtw_free_network for each of them. In some cases,
_rtw_free_network removes a network from the list.

We have to use list_for_each_entry_safe if we remove list entries while
we iterate over a list.

Fixes: 23017c8842d2 ("staging: rtl8188eu: Use list iterators and helpers")
Signed-off-by: Martin Kaiser <martin@kaiser.cx>
Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20210517201826.25150-1-martin@kaiser.cx
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8188eu/core/rtw_mlme.c

index 159465b..ba73ac5 100644 (file)
@@ -199,19 +199,17 @@ exit:
 
 void rtw_free_network_queue(struct adapter *padapter, u8 isfreeall)
 {
-       struct list_head *phead, *plist;
-       struct wlan_network *pnetwork;
+       struct list_head *phead;
+       struct wlan_network *pnetwork, *temp;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct __queue *scanned_queue = &pmlmepriv->scanned_queue;
 
        spin_lock_bh(&scanned_queue->lock);
 
        phead = get_list_head(scanned_queue);
-       list_for_each(plist, phead) {
-               pnetwork = list_entry(plist, struct wlan_network, list);
-
+       list_for_each_entry_safe(pnetwork, temp, phead, list)
                _rtw_free_network(pmlmepriv, pnetwork, isfreeall);
-       }
+
        spin_unlock_bh(&scanned_queue->lock);
 }