From 831f476cee704c37e7f96510135a90dfec6d00e9 Mon Sep 17 00:00:00 2001
From: Andy Walls <awalls@radix.net>
Date: Sat, 30 Jan 2010 15:50:51 -0300
Subject: [PATCH] V4L/DVB: cx18: Fix memory leak in cx18-alsa starting of PCM
 captures

The cx18_open_id is normally dynamically allocated and stored in the
filp->private_data for v4l2 file operations.  The cx18-alsa routines should
not dynamically allocate a cx18_open_id because they never store it anywhere
and never free it.  This change fixes that and plugs a memory leak.

Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
 drivers/media/video/cx18/cx18-alsa-pcm.c | 18 +++++-------------
 1 file changed, 5 insertions(+), 13 deletions(-)

diff --git a/drivers/media/video/cx18/cx18-alsa-pcm.c b/drivers/media/video/cx18/cx18-alsa-pcm.c
index 06862a69c7b02..cfa512112ca09 100644
--- a/drivers/media/video/cx18/cx18-alsa-pcm.c
+++ b/drivers/media/video/cx18/cx18-alsa-pcm.c
@@ -152,28 +152,20 @@ static int snd_cx18_pcm_capture_open(struct snd_pcm_substream *substream)
 	struct v4l2_device *v4l2_dev = cxsc->v4l2_dev;
 	struct cx18 *cx = to_cx18(v4l2_dev);
 	struct cx18_stream *s;
-	struct cx18_open_id *item;
+	struct cx18_open_id item;
 	int ret;
 
 	/* Instruct the cx18 to start sending packets */
 	snd_cx18_lock(cxsc);
 	s = &cx->streams[CX18_ENC_STREAM_TYPE_PCM];
 
-	/* Allocate memory */
-	item = kmalloc(sizeof(struct cx18_open_id), GFP_KERNEL);
-	if (NULL == item) {
-		snd_cx18_unlock(cxsc);
-		return -ENOMEM;
-	}
-
-	item->cx = cx;
-	item->type = s->type;
-	item->open_id = cx->open_id++;
+	item.cx = cx;
+	item.type = s->type;
+	item.open_id = cx->open_id++;
 
 	/* See if the stream is available */
-	if (cx18_claim_stream(item, item->type)) {
+	if (cx18_claim_stream(&item, item.type)) {
 		/* No, it's already in use */
-		kfree(item);
 		snd_cx18_unlock(cxsc);
 		return -EBUSY;
 	}
-- 
2.30.2