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>
                                                          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;
 }
        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 */
 
                                                      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;
 }
 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;
 
        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();