diff options
author | Dave Jones <davej@redhat.com> | 2006-03-06 14:03:37 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-03-22 10:36:15 +0100 |
commit | 5e315e9248329c53a8932b71532c28240125e3c4 (patch) | |
tree | b04a95d8f4aab4be44a3b19d4ace4f9337e4de11 | |
parent | 3de4414e798795ef5d719622dbf12bbe27a9e72e (diff) | |
download | linux-5e315e9248329c53a8932b71532c28240125e3c4.tar.bz2 |
[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>
-rw-r--r-- | sound/drivers/opl3/opl3_oss.c | 12 | ||||
-rw-r--r-- | sound/drivers/opl3/opl3_seq.c | 12 |
2 files changed, 16 insertions, 8 deletions
diff --git a/sound/drivers/opl3/opl3_oss.c b/sound/drivers/opl3/opl3_oss.c index 0345ae647681..fccf019a6d85 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 */ diff --git a/sound/drivers/opl3/opl3_seq.c b/sound/drivers/opl3/opl3_seq.c index e26556d500e5..57becf34f43e 100644 --- a/sound/drivers/opl3/opl3_seq.c +++ b/sound/drivers/opl3/opl3_seq.c @@ -207,8 +207,10 @@ static int snd_opl3_synth_create_port(struct snd_opl3 * opl3) 16, voices, name); if (opl3->chset->port < 0) { + int port; + port = opl3->chset->port; snd_midi_channel_free_set(opl3->chset); - return opl3->chset->port; + return port; } return 0; } @@ -218,7 +220,7 @@ static int snd_opl3_synth_create_port(struct snd_opl3 * opl3) static int snd_opl3_seq_new_device(struct snd_seq_device *dev) { struct snd_opl3 *opl3; - int client; + int client, err; char name[32]; int opl_ver; @@ -239,7 +241,11 @@ static int snd_opl3_seq_new_device(struct snd_seq_device *dev) if (client < 0) return client; - snd_opl3_synth_create_port(opl3); + if ((err = snd_opl3_synth_create_port(opl3)) < 0) { + snd_seq_delete_kernel_client(client); + opl3->seq_client = -1; + return err; + } /* initialize instrument list */ opl3->ilist = snd_seq_instr_list_new(); |