aboutsummaryrefslogtreecommitdiff
path: root/sound/drivers/opl3/opl3_oss.c
diff options
context:
space:
mode:
authorDave Jones <davej@redhat.com>2006-03-06 14:03:37 +0100
committerJaroslav Kysela <perex@suse.cz>2006-03-22 10:36:15 +0100
commit5e315e9248329c53a8932b71532c28240125e3c4 (patch)
treeb04a95d8f4aab4be44a3b19d4ace4f9337e4de11 /sound/drivers/opl3/opl3_oss.c
parent3de4414e798795ef5d719622dbf12bbe27a9e72e (diff)
[ALSA] Fix use after free in opl3_seq and opl3_oss
Modules: OPL3 Don't read from free'd memory. Also make use of the return value, and don't register the device if something went wrong creating the port. Coverity #954, #955 Signed-off-by: Dave Jones <davej@redhat.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/drivers/opl3/opl3_oss.c')
-rw-r--r--sound/drivers/opl3/opl3_oss.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/sound/drivers/opl3/opl3_oss.c b/sound/drivers/opl3/opl3_oss.c
index 0345ae64768..fccf019a6d8 100644
--- a/sound/drivers/opl3/opl3_oss.c
+++ b/sound/drivers/opl3/opl3_oss.c
@@ -104,8 +104,10 @@ static int snd_opl3_oss_create_port(struct snd_opl3 * opl3)
voices, voices,
name);
if (opl3->oss_chset->port < 0) {
+ int port;
+ port = opl3->oss_chset->port;
snd_midi_channel_free_set(opl3->oss_chset);
- return opl3->oss_chset->port;
+ return port;
}
return 0;
}
@@ -136,10 +138,10 @@ void snd_opl3_init_seq_oss(struct snd_opl3 *opl3, char *name)
arg->oper = oss_callback;
arg->private_data = opl3;
- snd_opl3_oss_create_port(opl3);
-
- /* register to OSS synth table */
- snd_device_register(opl3->card, dev);
+ if (snd_opl3_oss_create_port(opl3)) {
+ /* register to OSS synth table */
+ snd_device_register(opl3->card, dev);
+ }
}
/* unregister */