diff options
author | Dave Jones <davej@redhat.com> | 2006-03-06 08:03:37 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-03-22 04:36:15 -0500 |
commit | 5e315e9248329c53a8932b71532c28240125e3c4 (patch) | |
tree | b04a95d8f4aab4be44a3b19d4ace4f9337e4de11 /sound/drivers | |
parent | 3de4414e798795ef5d719622dbf12bbe27a9e72e (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')
-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) | |||
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) | |||
218 | static int snd_opl3_seq_new_device(struct snd_seq_device *dev) | 220 | static 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(); |