ASoC: wm8978: fix a memory leak if a wm8978_register fail
authorAxel Lin <axel.lin@gmail.com>
Fri, 23 Jul 2010 05:53:53 +0000 (05:53 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 3 Aug 2010 06:46:27 +0000 (07:46 +0100)
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>
Reviewed-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/wm8978.c

index 51d5f433215c14634b3f1e6875a919aa001fc6cd..8a1ad778e7e345d42780fec7baccbb6e0f9b984e 100644 (file)
@@ -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;
 }