diff options
author | Christian Engelmayer <cengelma@gmx.at> | 2013-12-31 12:33:57 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-01-03 15:37:01 -0500 |
commit | 47acf6f544314a383e2208bf0ba29528bb6302d2 (patch) | |
tree | 332a79df743ef4cc76cb2ccc8b4ce916dfb0244c /drivers/net/wireless/cw1200 | |
parent | 2c323058bcecb7d57610ebbcb85d4fa082d26c3b (diff) |
wireless: cw1200: Fix memory leak in cw1200_wow_suspend()
Fix a memory leak in the cw1200_wow_suspend() error handling path.
Signed-off-by: Christian Engelmayer <cengelma@gmx.at>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/cw1200')
-rw-r--r-- | drivers/net/wireless/cw1200/pm.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/net/wireless/cw1200/pm.c b/drivers/net/wireless/cw1200/pm.c index b37abb9f0453..6907c8fd4578 100644 --- a/drivers/net/wireless/cw1200/pm.c +++ b/drivers/net/wireless/cw1200/pm.c | |||
@@ -225,7 +225,7 @@ int cw1200_wow_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
225 | cw1200_set_pm(priv, &priv->powersave_mode); | 225 | cw1200_set_pm(priv, &priv->powersave_mode); |
226 | if (wait_event_interruptible_timeout(priv->ps_mode_switch_done, | 226 | if (wait_event_interruptible_timeout(priv->ps_mode_switch_done, |
227 | !priv->ps_mode_switch_in_progress, 1*HZ) <= 0) { | 227 | !priv->ps_mode_switch_in_progress, 1*HZ) <= 0) { |
228 | goto revert3; | 228 | goto revert4; |
229 | } | 229 | } |
230 | } | 230 | } |
231 | 231 | ||
@@ -254,11 +254,11 @@ int cw1200_wow_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
254 | 254 | ||
255 | /* Stop serving thread */ | 255 | /* Stop serving thread */ |
256 | if (cw1200_bh_suspend(priv)) | 256 | if (cw1200_bh_suspend(priv)) |
257 | goto revert4; | 257 | goto revert5; |
258 | 258 | ||
259 | ret = timer_pending(&priv->mcast_timeout); | 259 | ret = timer_pending(&priv->mcast_timeout); |
260 | if (ret) | 260 | if (ret) |
261 | goto revert5; | 261 | goto revert6; |
262 | 262 | ||
263 | /* Store suspend state */ | 263 | /* Store suspend state */ |
264 | pm_state->suspend_state = state; | 264 | pm_state->suspend_state = state; |
@@ -280,9 +280,9 @@ int cw1200_wow_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
280 | 280 | ||
281 | return 0; | 281 | return 0; |
282 | 282 | ||
283 | revert5: | 283 | revert6: |
284 | WARN_ON(cw1200_bh_resume(priv)); | 284 | WARN_ON(cw1200_bh_resume(priv)); |
285 | revert4: | 285 | revert5: |
286 | cw1200_resume_work(priv, &priv->bss_loss_work, | 286 | cw1200_resume_work(priv, &priv->bss_loss_work, |
287 | state->bss_loss_tmo); | 287 | state->bss_loss_tmo); |
288 | cw1200_resume_work(priv, &priv->join_timeout, | 288 | cw1200_resume_work(priv, &priv->join_timeout, |
@@ -291,6 +291,7 @@ revert4: | |||
291 | state->direct_probe); | 291 | state->direct_probe); |
292 | cw1200_resume_work(priv, &priv->link_id_gc_work, | 292 | cw1200_resume_work(priv, &priv->link_id_gc_work, |
293 | state->link_id_gc); | 293 | state->link_id_gc); |
294 | revert4: | ||
294 | kfree(state); | 295 | kfree(state); |
295 | revert3: | 296 | revert3: |
296 | wsm_set_udp_port_filter(priv, &cw1200_udp_port_filter_off); | 297 | wsm_set_udp_port_filter(priv, &cw1200_udp_port_filter_off); |