[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>
This commit is contained in:
committed by
Jaroslav Kysela
parent
3de4414e79
commit
5e315e9248
@@ -104,8 +104,10 @@ static int snd_opl3_oss_create_port(struct snd_opl3 * opl3)
|
|||||||
voices, voices,
|
voices, voices,
|
||||||
name);
|
name);
|
||||||
if (opl3->oss_chset->port < 0) {
|
if (opl3->oss_chset->port < 0) {
|
||||||
|
int port;
|
||||||
|
port = opl3->oss_chset->port;
|
||||||
snd_midi_channel_free_set(opl3->oss_chset);
|
snd_midi_channel_free_set(opl3->oss_chset);
|
||||||
return opl3->oss_chset->port;
|
return port;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -136,10 +138,10 @@ void snd_opl3_init_seq_oss(struct snd_opl3 *opl3, char *name)
|
|||||||
arg->oper = oss_callback;
|
arg->oper = oss_callback;
|
||||||
arg->private_data = opl3;
|
arg->private_data = opl3;
|
||||||
|
|
||||||
snd_opl3_oss_create_port(opl3);
|
if (snd_opl3_oss_create_port(opl3)) {
|
||||||
|
/* register to OSS synth table */
|
||||||
/* register to OSS synth table */
|
snd_device_register(opl3->card, dev);
|
||||||
snd_device_register(opl3->card, dev);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unregister */
|
/* unregister */
|
||||||
|
@@ -207,8 +207,10 @@ static int snd_opl3_synth_create_port(struct snd_opl3 * opl3)
|
|||||||
16, voices,
|
16, voices,
|
||||||
name);
|
name);
|
||||||
if (opl3->chset->port < 0) {
|
if (opl3->chset->port < 0) {
|
||||||
|
int port;
|
||||||
|
port = opl3->chset->port;
|
||||||
snd_midi_channel_free_set(opl3->chset);
|
snd_midi_channel_free_set(opl3->chset);
|
||||||
return opl3->chset->port;
|
return port;
|
||||||
}
|
}
|
||||||
return 0;
|
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)
|
static int snd_opl3_seq_new_device(struct snd_seq_device *dev)
|
||||||
{
|
{
|
||||||
struct snd_opl3 *opl3;
|
struct snd_opl3 *opl3;
|
||||||
int client;
|
int client, err;
|
||||||
char name[32];
|
char name[32];
|
||||||
int opl_ver;
|
int opl_ver;
|
||||||
|
|
||||||
@@ -239,7 +241,11 @@ static int snd_opl3_seq_new_device(struct snd_seq_device *dev)
|
|||||||
if (client < 0)
|
if (client < 0)
|
||||||
return client;
|
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 */
|
/* initialize instrument list */
|
||||||
opl3->ilist = snd_seq_instr_list_new();
|
opl3->ilist = snd_seq_instr_list_new();
|
||||||
|
Reference in New Issue
Block a user