staging: r8188eu: clean up NULL check for rcu pointer
authorMartin Kaiser <martin@kaiser.cx>
Tue, 31 Jan 2023 09:00:57 +0000 (10:00 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Feb 2023 09:44:38 +0000 (10:44 +0100)
Clean up the NULL check for padapter->pnetdev->rx_handler_data.

The current code calls rcu_dereference while it holds the rcu read lock
and checks the pointer after releasing the lock. An rcu pointer may only be
used between calls to rcu_read_lock and rcu_read_unlock.

Replace the check with rcu_access_pointer. My understanding is that this
function returns the value of the pointer and needs no locking. We can
then check the pointer but we must not dereference it.

Signed-off-by: Martin Kaiser <martin@kaiser.cx>
Link: https://lore.kernel.org/r/20230131090057.241779-1-martin@kaiser.cx
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/r8188eu/core/rtw_xmit.c

index 91f92ec5ef69449ac3e55529964640f81a810e64..18941320e70e290da5a2d9762151b8021de3aace 100644 (file)
@@ -1631,18 +1631,14 @@ s32 rtw_xmit(struct adapter *padapter, struct sk_buff **ppkt)
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
        struct xmit_frame *pxmitframe = NULL;
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
-       void *br_port = NULL;
        s32 res;
 
        pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
        if (!pxmitframe)
                return -1;
 
-       rcu_read_lock();
-       br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
-       rcu_read_unlock();
-
-       if (br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE)) {
+       if (rcu_access_pointer(padapter->pnetdev->rx_handler_data) &&
+           check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE)) {
                res = rtw_br_client_tx(padapter, ppkt);
                if (res == -1) {
                        rtw_free_xmitframe(pxmitpriv, pxmitframe);