lkml.org 
[lkml]   [2010]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v2 11/12] wm8978: fix a memory leak if another WM8978 is registered
On Thu, 15 Jul 2010, Axel Lin wrote:

> >>From e53ff15ee6843d6591509f9aeeb2fa1a0c1eccee Mon Sep 17 00:00:00 2001
> From: Axel Lin <axel.lin@gmail.com>
> Date: Thu, 15 Jul 2010 16:33:20 +0800
> Subject: [PATCH] wm8978: fix a memory leak if a wm8978_register fail
>
> There is a memory leak found if wm8978_register() fail.
> This patch moves the buffer allocate and release
> at the same level to prevent the memory leak.
>
> Signed-off-by: Axel Lin <axel.lin@gmail.com>

Thanks for the patch, Axel! Only compile-tested, so, here's

Reviewed-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>

Guennadi

> ---
> sound/soc/codecs/wm8978.c | 10 +++++++---
> 1 files changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/sound/soc/codecs/wm8978.c b/sound/soc/codecs/wm8978.c
> index 51d5f43..8a1ad77 100644
> --- a/sound/soc/codecs/wm8978.c
> +++ b/sound/soc/codecs/wm8978.c
> @@ -1076,7 +1076,6 @@ static __devinit int wm8978_register(struct wm8978_priv *wm8978)
> err_codec:
> snd_soc_unregister_codec(codec);
> err:
> - kfree(wm8978);
> return ret;
> }
>
> @@ -1085,13 +1084,13 @@ static __devexit void wm8978_unregister(struct wm8978_priv *wm8978)
> wm8978_set_bias_level(&wm8978->codec, SND_SOC_BIAS_OFF);
> snd_soc_unregister_dai(&wm8978_dai);
> snd_soc_unregister_codec(&wm8978->codec);
> - kfree(wm8978);
> wm8978_codec = NULL;
> }
>
> static __devinit int wm8978_i2c_probe(struct i2c_client *i2c,
> const struct i2c_device_id *id)
> {
> + int ret;
> struct wm8978_priv *wm8978;
> struct snd_soc_codec *codec;
>
> @@ -1107,13 +1106,18 @@ static __devinit int wm8978_i2c_probe(struct i2c_client *i2c,
>
> codec->dev = &i2c->dev;
>
> - return wm8978_register(wm8978);
> + ret = wm8978_register(wm8978);
> + if (ret < 0)
> + kfree(wm8978);
> +
> + return ret;
> }
>
> static __devexit int wm8978_i2c_remove(struct i2c_client *client)
> {
> struct wm8978_priv *wm8978 = i2c_get_clientdata(client);
> wm8978_unregister(wm8978);
> + kfree(wm8978);
> return 0;
> }
>
> --
> 1.5.4.3
>
>
>

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/


\
 
 \ /
  Last update: 2010-07-15 10:55    [W:0.071 / U:9.300 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site