diff options
author | Axel Lin <axel.lin@gmail.com> | 2010-12-07 20:56:30 +0800 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-12-07 14:51:15 +0000 |
commit | 681e36924788aeea2717c07cc42a21c9c86d7559 (patch) | |
tree | b896db25da65d4185771b2686e9a215da3af07a1 | |
parent | 1dcb4f38e5bc28dfce0f8c7eef184a090b03bfc7 (diff) | |
download | linux-3.10-681e36924788aeea2717c07cc42a21c9c86d7559.tar.gz linux-3.10-681e36924788aeea2717c07cc42a21c9c86d7559.tar.bz2 linux-3.10-681e36924788aeea2717c07cc42a21c9c86d7559.zip |
ASoC: Fix resource leak if soc_register_ac97_dai_link failed
Properly free the resources in the case of soc_register_ac97_dai_link failure.
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r-- | sound/soc/soc-core.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 02ae7bea3b5..85b7d548f16 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -1619,12 +1619,14 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card) #ifdef CONFIG_SND_SOC_AC97_BUS /* register any AC97 codecs */ for (i = 0; i < card->num_rtd; i++) { - ret = soc_register_ac97_dai_link(&card->rtd[i]); - if (ret < 0) { - printk(KERN_ERR "asoc: failed to register AC97 %s\n", card->name); - goto probe_dai_err; - } + ret = soc_register_ac97_dai_link(&card->rtd[i]); + if (ret < 0) { + printk(KERN_ERR "asoc: failed to register AC97 %s\n", card->name); + while (--i >= 0) + soc_unregister_ac97_dai_link(&card->rtd[i]); + goto probe_dai_err; } + } #endif card->instantiated = 1; |