ALSA: hda - Fix error path in the sanity check in azx_pcm_open()
authorTakashi Iwai <tiwai@suse.de>
Sun, 5 Jul 2009 09:44:46 +0000 (11:44 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sun, 5 Jul 2009 09:44:46 +0000 (11:44 +0200)
Release resources cleanly after errors in the sanity check in
azx_pcm_open().

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_intel.c

index 1877d95..16e09d7 100644 (file)
@@ -1455,6 +1455,17 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
                return err;
        }
        snd_pcm_limit_hw_rates(runtime);
                return err;
        }
        snd_pcm_limit_hw_rates(runtime);
+       /* sanity check */
+       if (snd_BUG_ON(!runtime->hw.channels_min) ||
+           snd_BUG_ON(!runtime->hw.channels_max) ||
+           snd_BUG_ON(!runtime->hw.formats) ||
+           snd_BUG_ON(!runtime->hw.rates)) {
+               azx_release_device(azx_dev);
+               hinfo->ops.close(hinfo, apcm->codec, substream);
+               snd_hda_power_down(apcm->codec);
+               mutex_unlock(&chip->open_mutex);
+               return -EINVAL;
+       }
        spin_lock_irqsave(&chip->reg_lock, flags);
        azx_dev->substream = substream;
        azx_dev->running = 0;
        spin_lock_irqsave(&chip->reg_lock, flags);
        azx_dev->substream = substream;
        azx_dev->running = 0;
@@ -1463,13 +1474,6 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
        runtime->private_data = azx_dev;
        snd_pcm_set_sync(substream);
        mutex_unlock(&chip->open_mutex);
        runtime->private_data = azx_dev;
        snd_pcm_set_sync(substream);
        mutex_unlock(&chip->open_mutex);
-
-       if (snd_BUG_ON(!runtime->hw.channels_min || !runtime->hw.channels_max))
-               return -EINVAL;
-       if (snd_BUG_ON(!runtime->hw.formats))
-               return -EINVAL;
-       if (snd_BUG_ON(!runtime->hw.rates))
-               return -EINVAL;
        return 0;
 }
 
        return 0;
 }