lkml.org 
[lkml]   [2022]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 501/530] staging: rtl8723bs: fix potential memory leak in rtw_init_drv_sw()
    Date
    From: Xiaoke Wang <xkernel.wang@foxmail.com>

    [ Upstream commit 5a5aa9cce621e2c0e25a1e5d72d6be1749167cc0 ]

    In rtw_init_drv_sw(), there are various init functions are called to
    populate the padapter structure and some checks for their return value.
    However, except for the first one error path, the other five error paths
    do not properly release the previous allocated resources, which leads to
    various memory leaks.

    This patch fixes them and keeps the success and error separate.
    Note that these changes keep the form of `rtw_init_drv_sw()` in
    "drivers/staging/r8188eu/os_dep/os_intfs.c". As there is no proper device
    to test with, no runtime testing was performed.

    Signed-off-by: Xiaoke Wang <xkernel.wang@foxmail.com>
    Link: https://lore.kernel.org/r/tencent_C3B899D2FC3F1BC827F3552E0B0734056006@qq.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/staging/rtl8723bs/os_dep/os_intfs.c | 60 +++++++++++----------
    1 file changed, 31 insertions(+), 29 deletions(-)

    diff --git a/drivers/staging/rtl8723bs/os_dep/os_intfs.c b/drivers/staging/rtl8723bs/os_dep/os_intfs.c
    index f78bf174de8e..23f4f706f935 100644
    --- a/drivers/staging/rtl8723bs/os_dep/os_intfs.c
    +++ b/drivers/staging/rtl8723bs/os_dep/os_intfs.c
    @@ -664,51 +664,36 @@ void rtw_reset_drv_sw(struct adapter *padapter)

    u8 rtw_init_drv_sw(struct adapter *padapter)
    {
    - u8 ret8 = _SUCCESS;
    -
    rtw_init_default_value(padapter);

    rtw_init_hal_com_default_value(padapter);

    - if (rtw_init_cmd_priv(&padapter->cmdpriv)) {
    - ret8 = _FAIL;
    - goto exit;
    - }
    + if (rtw_init_cmd_priv(&padapter->cmdpriv))
    + return _FAIL;

    padapter->cmdpriv.padapter = padapter;

    - if (rtw_init_evt_priv(&padapter->evtpriv)) {
    - ret8 = _FAIL;
    - goto exit;
    - }
    + if (rtw_init_evt_priv(&padapter->evtpriv))
    + goto free_cmd_priv;

    -
    - if (rtw_init_mlme_priv(padapter) == _FAIL) {
    - ret8 = _FAIL;
    - goto exit;
    - }
    + if (rtw_init_mlme_priv(padapter) == _FAIL)
    + goto free_evt_priv;

    init_mlme_ext_priv(padapter);

    - if (_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) {
    - ret8 = _FAIL;
    - goto exit;
    - }
    + if (_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL)
    + goto free_mlme_ext;

    - if (_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) {
    - ret8 = _FAIL;
    - goto exit;
    - }
    + if (_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL)
    + goto free_xmit_priv;
    /* add for CONFIG_IEEE80211W, none 11w also can use */
    spin_lock_init(&padapter->security_key_mutex);

    /* We don't need to memset padapter->XXX to zero, because adapter is allocated by vzalloc(). */
    /* memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); */

    - if (_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) {
    - ret8 = _FAIL;
    - goto exit;
    - }
    + if (_rtw_init_sta_priv(&padapter->stapriv) == _FAIL)
    + goto free_recv_priv;

    padapter->stapriv.padapter = padapter;
    padapter->setband = GHZ24_50;
    @@ -719,9 +704,26 @@ u8 rtw_init_drv_sw(struct adapter *padapter)

    rtw_hal_dm_init(padapter);

    -exit:
    + return _SUCCESS;
    +
    +free_recv_priv:
    + _rtw_free_recv_priv(&padapter->recvpriv);
    +
    +free_xmit_priv:
    + _rtw_free_xmit_priv(&padapter->xmitpriv);
    +
    +free_mlme_ext:
    + free_mlme_ext_priv(&padapter->mlmeextpriv);

    - return ret8;
    + rtw_free_mlme_priv(&padapter->mlmepriv);
    +
    +free_evt_priv:
    + rtw_free_evt_priv(&padapter->evtpriv);
    +
    +free_cmd_priv:
    + rtw_free_cmd_priv(&padapter->cmdpriv);
    +
    + return _FAIL;
    }

    void rtw_cancel_all_timer(struct adapter *padapter)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-24 22:11    [W:4.090 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site