| From foo@baz Thu Mar 22 14:40:23 CET 2018 |
| From: Brian Norris <briannorris@chromium.org> |
| Date: Fri, 14 Apr 2017 14:51:20 -0700 |
| Subject: mwifiex: don't leak 'chan_stats' on reset |
| |
| From: Brian Norris <briannorris@chromium.org> |
| |
| |
| [ Upstream commit fb9e67bee3ab7111513130c516ffe378d885c0d0 ] |
| |
| 'chan_stats' is (re)allocated in _mwifiex_fw_dpc() -> |
| mwifiex_init_channel_scan_gap(), which is called whenever the device is |
| initialized -- at probe or at reset. |
| |
| But we only free it in we completely unregister the adapter, meaning we |
| leak a copy of it during every reset. |
| |
| Let's free it in the shutdown / removal paths instead (and in the |
| error-handling path), to avoid the leak. |
| |
| Ideally, we can eventually unify much of mwifiex_shutdown_sw() and |
| mwifiex_remove_card() (way too much copy-and-paste) to reduce the burden |
| on bugfixes like this. But that's work for tomorrow. |
| |
| Signed-off-by: Brian Norris <briannorris@chromium.org> |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/wireless/marvell/mwifiex/main.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/wireless/marvell/mwifiex/main.c |
| +++ b/drivers/net/wireless/marvell/mwifiex/main.c |
| @@ -146,7 +146,6 @@ static int mwifiex_unregister(struct mwi |
| |
| kfree(adapter->regd); |
| |
| - vfree(adapter->chan_stats); |
| kfree(adapter); |
| return 0; |
| } |
| @@ -636,6 +635,7 @@ static void mwifiex_fw_dpc(const struct |
| goto done; |
| |
| err_add_intf: |
| + vfree(adapter->chan_stats); |
| wiphy_unregister(adapter->wiphy); |
| wiphy_free(adapter->wiphy); |
| err_init_fw: |
| @@ -1429,6 +1429,7 @@ mwifiex_shutdown_sw(struct mwifiex_adapt |
| mwifiex_del_virtual_intf(adapter->wiphy, &priv->wdev); |
| rtnl_unlock(); |
| } |
| + vfree(adapter->chan_stats); |
| |
| up(sem); |
| exit_sem_err: |
| @@ -1729,6 +1730,7 @@ int mwifiex_remove_card(struct mwifiex_a |
| mwifiex_del_virtual_intf(adapter->wiphy, &priv->wdev); |
| rtnl_unlock(); |
| } |
| + vfree(adapter->chan_stats); |
| |
| wiphy_unregister(adapter->wiphy); |
| wiphy_free(adapter->wiphy); |