summaryrefslogtreecommitdiffstats
path: root/sound/core
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2006-11-23 12:03:24 +0100
committerJaroslav Kysela <perex@server.perex.cz>2006-12-20 08:56:00 +0100
commit4d361285925613516560f81f8c7fc96b89c8b1a8 (patch)
treefe0d8766af901f3fa99023f6aaab223412f6f364 /sound/core
parentc13893d7be4f159b359a1b7ee46b3646ecb2fe20 (diff)
downloadlinux-4d361285925613516560f81f8c7fc96b89c8b1a8.tar.gz
linux-4d361285925613516560f81f8c7fc96b89c8b1a8.tar.bz2
linux-4d361285925613516560f81f8c7fc96b89c8b1a8.zip
[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)
err = snd_pcm_substream_proc_init(substream);
if (err < 0) {
snd_printk(KERN_ERR "Error in snd_pcm_stream_proc_init\n");
+ if (prev == NULL)
+ pstr->substream = NULL;
+ else
+ prev->next = NULL;
kfree(substream);
return err;
}