ASoC: core: fix the memory leak in case of device_add() failure
authorChuansheng Liu <chuansheng.liu@intel.com>
Tue, 25 Dec 2012 16:56:05 +0000 (00:56 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 27 Dec 2012 16:14:43 +0000 (16:14 +0000)
After called device_initialize(), even device_add() returns
error, we still need use the put_device() to release the reference
to call rtd_release(), which will do the free() action.

Signed-off-by: liu chuansheng <chuansheng.liu@intel.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/soc-core.c

index 29046e750ad774b94b3aab787cab7630c8f71833..f7551c1c827ce76c16adbb9425b58fe23fe52f1c 100644 (file)
@@ -1255,6 +1255,8 @@ static int soc_post_component_init(struct snd_soc_card *card,
        INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].fe_clients);
        ret = device_add(rtd->dev);
        if (ret < 0) {
        INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].fe_clients);
        ret = device_add(rtd->dev);
        if (ret < 0) {
+               /* calling put_device() here to free the rtd->dev */
+               put_device(rtd->dev);
                dev_err(card->dev,
                        "ASoC: failed to register runtime device: %d\n", ret);
                return ret;
                dev_err(card->dev,
                        "ASoC: failed to register runtime device: %d\n", ret);
                return ret;