V4L/DVB (13904): cx18: Fix TS and IDX stream buffer memory leak on module unload
authorAndy Walls <awalls@radix.net>
Thu, 31 Dec 2009 04:35:08 +0000 (01:35 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 26 Feb 2010 18:10:29 +0000 (15:10 -0300)
Fix a long standing memory leak of stream buffers for streams that did not
have a struct video_device allocated: namely the TS and IDX streams.

Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx18/cx18-queue.c
drivers/media/video/cx18/cx18-streams.c

index 6330482..aefc8c8 100644 (file)
@@ -419,6 +419,9 @@ void cx18_stream_free(struct cx18_stream *s)
 {
        struct cx18_mdl *mdl;
        struct cx18_buffer *buf;
+       struct cx18 *cx = s->cx;
+
+       CX18_DEBUG_INFO("Deallocating buffers for %s stream\n", s->name);
 
        /* move all buffers to buf_pool and all MDLs to q_idle */
        cx18_unload_queues(s);
index 9be603c..1764971 100644 (file)
@@ -319,11 +319,27 @@ void cx18_streams_cleanup(struct cx18 *cx, int unregister)
 
        /* Teardown all streams */
        for (type = 0; type < CX18_MAX_STREAMS; type++) {
-               if (cx->streams[type].dvb.enabled) {
-                       cx18_dvb_unregister(&cx->streams[type]);
-                       cx->streams[type].dvb.enabled = false;
+
+               /* No struct video_device, but can have buffers allocated */
+               if (type == CX18_ENC_STREAM_TYPE_TS) {
+                       if (cx->streams[type].dvb.enabled) {
+                               cx18_dvb_unregister(&cx->streams[type]);
+                               cx->streams[type].dvb.enabled = false;
+                               cx18_stream_free(&cx->streams[type]);
+                       }
+                       continue;
+               }
+
+               /* No struct video_device, but can have buffers allocated */
+               if (type == CX18_ENC_STREAM_TYPE_IDX) {
+                       if (cx->stream_buffers[type] != 0) {
+                               cx->stream_buffers[type] = 0;
+                               cx18_stream_free(&cx->streams[type]);
+                       }
+                       continue;
                }
 
+               /* If struct video_device exists, can have buffers allocated */
                vdev = cx->streams[type].video_dev;
 
                cx->streams[type].video_dev = NULL;