ASoC: Fix resource leak if soc_register_ac97_dai_link failed
PATCH 1/1 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.
---
This patch is against Linus tree.
Regards,
Axel
sound/soc/soc-core.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-)
sound/soc/soc-core.c +7 -5
@@ -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 ;
Signature · 1 line
1.7.0.4
Mark Brown
AppliedQuoted 3 lines · Axel Lin
Properly free the resources in the case of
soc_register_ac97_dai_linkfailure.Signed-off-by Axel Lin <[email protected]>
Applied, thanks.
Quoted 10 lines · Axel Lin
sound/soc/soc-core.c +0
-4@@ -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;
sound/soc/soc-core.c static void snd_soc_instantiate_card(struct snd_soc_card *card) · line 1630
Quoted 10 lines
sound/soc/soc-core.c +7
-1- } + 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
this isnt entirely correct. soc_unregister_ac97_dai_link takes a pointer to a codec which card->rtd[i] is not. sound/soc/soc-core.c: In function ‘snd_soc_instantiate_card’:sound/soc/soc-core.c:1626: warning: passing argument 1 of ‘soc_unregister_ac97_dai_link’ from incompatible pointer type -mike
Quoted 7 lines
this isnt entirely correct. soc_unregister_ac97_dai_link takes a pointer to a codec which card->rtd[i] is not.
sound/soc/soc-core.c: In function ‘snd_soc_instantiate_card’:sound/soc/soc-core.c:1626: warning: passing argument 1 of ‘soc_unregister_ac97_dai_link’ from incompatible pointer type -mike
Ooops. my bad.
I will send a patch for 2.6.37 to fix it.
Thanks for report this bug.
Regards,
Axel