aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorDave Jones <davej@redhat.com>2006-03-06 08:03:37 -0500
committerJaroslav Kysela <perex@suse.cz>2006-03-22 04:36:15 -0500
commit5e315e9248329c53a8932b71532c28240125e3c4 (patch)
treeb04a95d8f4aab4be44a3b19d4ace4f9337e4de11 /sound
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')
-rw-r--r--sound/drivers/opl3/opl3_oss.c12
-rw-r--r--sound/drivers/opl3/opl3_seq.c12
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)
104 voices, voices, 104 voices, voices,
105 name); 105 name);
106 if (opl3->oss_chset->port < 0) { 106 if (opl3->oss_chset->port < 0) {
107 int port;
108 port = opl3->oss_chset->port;
107 snd_midi_channel_free_set(opl3->oss_chset); 109 snd_midi_channel_free_set(opl3->oss_chset);
108 return opl3->oss_chset->port; 110 return port;
109 } 111 }
110 return 0; 112 return 0;
111} 113}
@@ -136,10 +138,10 @@ void snd_opl3_init_seq_oss(struct snd_opl3 *opl3, char *name)
136 arg->oper = oss_callback; 138 arg->oper = oss_callback;
137 arg->private_data = opl3; 139 arg->private_data = opl3;
138 140
139 snd_opl3_oss_create_port(opl3); 141 if (snd_opl3_oss_create_port(opl3)) {
140 142 /* register to OSS synth table */
141 /* register to OSS synth table */ 143 snd_device_register(opl3->card, dev);
142 snd_device_register(opl3->card, dev); 144 }
143} 145}
144 146
145/* unregister */ 147/* 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)
207 16, voices, 207 16, voices,
208 name); 208 name);
209 if (opl3->chset->port < 0) { 209 if (opl3->chset->port < 0) {
210 int port;
211 port = opl3->chset->port;
210 snd_midi_channel_free_set(opl3->chset); 212 snd_midi_channel_free_set(opl3->chset);
211 return opl3->chset->port; 213 return port;
212 } 214 }
213 return 0; 215 return 0;
214} 216}
@@ -218,7 +220,7 @@ static int snd_opl3_synth_create_port(struct snd_opl3 * opl3)
218static int snd_opl3_seq_new_device(struct snd_seq_device *dev) 220static int snd_opl3_seq_new_device(struct snd_seq_device *dev)
219{ 221{
220 struct snd_opl3 *opl3; 222 struct snd_opl3 *opl3;
221 int client; 223 int client, err;
222 char name[32]; 224 char name[32];
223 int opl_ver; 225 int opl_ver;
224 226
@@ -239,7 +241,11 @@ static int snd_opl3_seq_new_device(struct snd_seq_device *dev)
239 if (client < 0) 241 if (client < 0)
240 return client; 242 return client;
241 243
242 snd_opl3_synth_create_port(opl3); 244 if ((err = snd_opl3_synth_create_port(opl3)) < 0) {
245 snd_seq_delete_kernel_client(client);
246 opl3->seq_client = -1;
247 return err;
248 }
243 249
244 /* initialize instrument list */ 250 /* initialize instrument list */
245 opl3->ilist = snd_seq_instr_list_new(); 251 opl3->ilist = snd_seq_instr_list_new();