aboutsummaryrefslogtreecommitdiffstats
path: root/sound/core
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2006-11-23 06:03:24 -0500
committerJaroslav Kysela <perex@server.perex.cz>2006-12-20 02:56:00 -0500
commit4d361285925613516560f81f8c7fc96b89c8b1a8 (patch)
treefe0d8766af901f3fa99023f6aaab223412f6f364 /sound/core
parentc13893d7be4f159b359a1b7ee46b3646ecb2fe20 (diff)
[ALSA] sound: fix PCM substream list
If snd_pcm_new_stream() fails to initalize a substream (if snd_pcm_substream_proc_init() returns error), snd_pcm_new_stream() immediately return without unlinking that kfree()d substram. It causes oops when snd_pcm_free() iterates the list of substream to free them by invalid reference. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/core')
-rw-r--r--sound/core/pcm.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sound/core/pcm.c b/sound/core/pcm.c
index 5ac6e19ccb41..8e0189885516 100644
--- a/sound/core/pcm.c
+++ b/sound/core/pcm.c
@@ -640,6 +640,10 @@ int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count)
640 err = snd_pcm_substream_proc_init(substream); 640 err = snd_pcm_substream_proc_init(substream);
641 if (err < 0) { 641 if (err < 0) {
642 snd_printk(KERN_ERR "Error in snd_pcm_stream_proc_init\n"); 642 snd_printk(KERN_ERR "Error in snd_pcm_stream_proc_init\n");
643 if (prev == NULL)
644 pstr->substream = NULL;
645 else
646 prev->next = NULL;
643 kfree(substream); 647 kfree(substream);
644 return err; 648 return err;
645 } 649 }