Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7034632d authored by Eugene Teo's avatar Eugene Teo Committed by Jaroslav Kysela
Browse files

[ALSA] seq: resource leak fix and various code cleanups



This patch fixes:
1) a resource leak (CID: 1817)
2) various code cleanups

Signed-off-by: default avatarEugene Teo <eugeneteo@kernel.sg>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent 2880a867
Loading
Loading
Loading
Loading
+23 −17
Original line number Diff line number Diff line
@@ -176,29 +176,29 @@ snd_seq_oss_open(struct file *file, int level)
	int i, rc;
	struct seq_oss_devinfo *dp;

	if ((dp = kzalloc(sizeof(*dp), GFP_KERNEL)) == NULL) {
	dp = kzalloc(sizeof(*dp), GFP_KERNEL);
	if (!dp) {
		snd_printk(KERN_ERR "can't malloc device info\n");
		return -ENOMEM;
	}
	debug_printk(("oss_open: dp = %p\n", dp));

	dp->cseq = system_client;
	dp->port = -1;
	dp->queue = -1;

	for (i = 0; i < SNDRV_SEQ_OSS_MAX_CLIENTS; i++) {
		if (client_table[i] == NULL)
			break;
	}

	dp->index = i;
	if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) {
		snd_printk(KERN_ERR "too many applications\n");
		kfree(dp);
		return -ENOMEM;
		rc = -ENOMEM;
		goto _error;
	}

	dp->index = i;
	dp->cseq = system_client;
	dp->port = -1;
	dp->queue = -1;
	dp->readq = NULL;
	dp->writeq = NULL;

	/* look up synth and midi devices */
	snd_seq_oss_synth_setup(dp);
	snd_seq_oss_midi_setup(dp);
@@ -211,14 +211,16 @@ snd_seq_oss_open(struct file *file, int level)

	/* create port */
	debug_printk(("create new port\n"));
	if ((rc = create_port(dp)) < 0) {
	rc = create_port(dp);
	if (rc < 0) {
		snd_printk(KERN_ERR "can't create port\n");
		goto _error;
	}

	/* allocate queue */
	debug_printk(("allocate queue\n"));
	if ((rc = alloc_seq_queue(dp)) < 0)
	rc = alloc_seq_queue(dp);
	if (rc < 0)
		goto _error;

	/* set address */
@@ -235,7 +237,8 @@ snd_seq_oss_open(struct file *file, int level)
	/* initialize read queue */
	debug_printk(("initialize read queue\n"));
	if (is_read_mode(dp->file_mode)) {
		if ((dp->readq = snd_seq_oss_readq_new(dp, maxqlen)) == NULL) {
		dp->readq = snd_seq_oss_readq_new(dp, maxqlen);
		if (!dp->readq) {
			rc = -ENOMEM;
			goto _error;
		}
@@ -245,7 +248,7 @@ snd_seq_oss_open(struct file *file, int level)
	debug_printk(("initialize write queue\n"));
	if (is_write_mode(dp->file_mode)) {
		dp->writeq = snd_seq_oss_writeq_new(dp, maxqlen);
		if (dp->writeq == NULL) {
		if (!dp->writeq) {
			rc = -ENOMEM;
			goto _error;
		}
@@ -253,7 +256,8 @@ snd_seq_oss_open(struct file *file, int level)

	/* initialize timer */
	debug_printk(("initialize timer\n"));
	if ((dp->timer = snd_seq_oss_timer_new(dp)) == NULL) {
	dp->timer = snd_seq_oss_timer_new(dp);
	if (!dp->timer) {
		snd_printk(KERN_ERR "can't alloc timer\n");
		rc = -ENOMEM;
		goto _error;
@@ -276,11 +280,13 @@ snd_seq_oss_open(struct file *file, int level)
	return 0;

 _error:
	snd_seq_oss_writeq_delete(dp->writeq);
	snd_seq_oss_readq_delete(dp->readq);
	snd_seq_oss_synth_cleanup(dp);
	snd_seq_oss_midi_cleanup(dp);
	i = dp->queue;
	delete_port(dp);
	delete_seq_queue(i);
	delete_seq_queue(dp->queue);
	kfree(dp);

	return rc;
}
+4 −2
Original line number Diff line number Diff line
@@ -63,9 +63,11 @@ snd_seq_oss_writeq_new(struct seq_oss_devinfo *dp, int maxlen)
void
snd_seq_oss_writeq_delete(struct seq_oss_writeq *q)
{
	if (q) {
		snd_seq_oss_writeq_clear(q);	/* to be sure */
		kfree(q);
	}
}


/*