diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2006-11-23 06:03:24 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@server.perex.cz> | 2006-12-20 02:56:00 -0500 |
commit | 4d361285925613516560f81f8c7fc96b89c8b1a8 (patch) | |
tree | fe0d8766af901f3fa99023f6aaab223412f6f364 /sound | |
parent | c13893d7be4f159b359a1b7ee46b3646ecb2fe20 (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')
-rw-r--r-- | sound/core/pcm.c | 4 |
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 | } |