Skip to contentSkip to conversation

ASoC: Fix resource leak if soc_register_ac97_dai_link failed

PATCH Applied Axel Lin 3 participants 4 messages Dec 7, 2010 – Jan 12, 2011

Subsystems (2)
lore
Share & tools
lore

Axel Lin

author
#0 lore raw

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
index 441285a..d7f80c3 100644
@@ -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
#2 lore raw
In reply to Axel Lin
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

author
#3 lore raw
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