Update of /cvsroot/alsa/alsa-kernel/core/seq/oss
In directory sc8-pr-cvs1:/tmp/cvs-serv24080/core/seq/oss

Modified Files:
        seq_oss_init.c 
Log Message:
fixed memory leaks at the error open path.



Index: seq_oss_init.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/seq/oss/seq_oss_init.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- seq_oss_init.c      19 Dec 2002 15:59:18 -0000      1.8
+++ seq_oss_init.c      5 Mar 2003 11:31:12 -0000       1.9
@@ -193,6 +193,7 @@
        }
        if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) {
                snd_printk(KERN_ERR "too many applications\n");
+               kfree(dp);
                return -ENOMEM;
        }
 
@@ -209,22 +210,19 @@
 
        if (dp->synth_opened == 0 && dp->max_mididev == 0) {
                snd_printk(KERN_ERR "no device found\n");
-               kfree(dp);
-               return -ENODEV;
+               rc = -ENODEV;
+               goto _error;
        }
 
        /* create port */
        if ((rc = create_port(dp)) < 0) {
                snd_printk(KERN_ERR "can't create port\n");
-               free_devinfo(dp);
-               return rc;
+               goto _error;
        }
 
        /* allocate queue */
-       if ((rc = alloc_seq_queue(dp)) < 0) {
-               delete_port(dp);
-               return rc;
-       }
+       if ((rc = alloc_seq_queue(dp)) < 0)
+               goto _error;
 
        /* set address */
        dp->addr.client = dp->cseq;
@@ -240,9 +238,8 @@
        /* initialize read queue */
        if (is_read_mode(dp->file_mode)) {
                if ((dp->readq = snd_seq_oss_readq_new(dp, maxqlen)) == NULL) {
-                       delete_seq_queue(dp);
-                       delete_port(dp);
-                       return -ENOMEM;
+                       rc = -ENOMEM;
+                       goto _error;
                }
        }
 
@@ -250,18 +247,16 @@
        if (is_write_mode(dp->file_mode)) {
                dp->writeq = snd_seq_oss_writeq_new(dp, maxqlen);
                if (dp->writeq == NULL) {
-                       delete_seq_queue(dp);
-                       delete_port(dp);
-                       return -ENOMEM;
+                       rc = -ENOMEM;
+                       goto _error;
                }
        }
 
        /* initialize timer */
        if ((dp->timer = snd_seq_oss_timer_new(dp)) == NULL) {
                snd_printk(KERN_ERR "can't alloc timer\n");
-               delete_seq_queue(dp);
-               delete_port(dp);
-               return -ENOMEM;
+               rc = -ENOMEM;
+               goto _error;
        }
 
        /* set private data pointer */
@@ -277,8 +272,15 @@
        num_clients++;
 
        debug_printk(("open done\n"));
-
        return 0;
+
+ _error:
+       delete_seq_queue(dp);
+       delete_port(dp);
+       snd_seq_oss_synth_cleanup(dp);
+       snd_seq_oss_midi_cleanup(dp);
+
+       return rc;
 }
 
 /*



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to