aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulia Lawall <julia@diku.dk>2009-11-21 06:49:41 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-12-05 15:41:45 -0500
commitcd0e280f1bbecebcd20ed0ddd4dd8fb03a506b3c (patch)
treed2dc56a3b69eb7b77cfb9d0dc122329f7e17aae7
parentc95a419a5604ec8a23cd73f61e9bb151e8cbe89b (diff)
V4L/DVB (13413): introduce missing kfree
Error handling code following a kzalloc should free the allocated data. Similarly for usb-alloc urb. The semantic match that finds the first problem is as follows: (http://www.emn.fr/x-info/coccinelle/) // <smpl> @r exists@ local idexpression x; statement S; expression E; identifier f,f1,l; position p1,p2; expression *ptr != NULL; @@ x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...); ... if (x == NULL) S <... when != x when != if (...) { <+...x...+> } ( x->f1 = E | (x->f1 == NULL || ...) | f(...,x->f1,...) ) ...> ( return \(0\|<+...x...+>\|ptr\); | return@p2 ...; ) @script:python@ p1 << r.p1; p2 << r.p2; @@ print "* file: %s kmalloc %s return %s" % (p1[0].file,p1[0].line,p2[0].line) // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/hdpvr/hdpvr-video.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/media/video/hdpvr/hdpvr-video.c b/drivers/media/video/hdpvr/hdpvr-video.c
index 2eb9dc2ebe59..b5439cabb381 100644
--- a/drivers/media/video/hdpvr/hdpvr-video.c
+++ b/drivers/media/video/hdpvr/hdpvr-video.c
@@ -139,7 +139,7 @@ int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count)
139 urb = usb_alloc_urb(0, GFP_KERNEL); 139 urb = usb_alloc_urb(0, GFP_KERNEL);
140 if (!urb) { 140 if (!urb) {
141 v4l2_err(&dev->v4l2_dev, "cannot allocate urb\n"); 141 v4l2_err(&dev->v4l2_dev, "cannot allocate urb\n");
142 goto exit; 142 goto exit_urb;
143 } 143 }
144 buf->urb = urb; 144 buf->urb = urb;
145 145
@@ -148,7 +148,7 @@ int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count)
148 if (!mem) { 148 if (!mem) {
149 v4l2_err(&dev->v4l2_dev, 149 v4l2_err(&dev->v4l2_dev,
150 "cannot allocate usb transfer buffer\n"); 150 "cannot allocate usb transfer buffer\n");
151 goto exit; 151 goto exit_urb_buffer;
152 } 152 }
153 153
154 usb_fill_bulk_urb(buf->urb, dev->udev, 154 usb_fill_bulk_urb(buf->urb, dev->udev,
@@ -161,6 +161,10 @@ int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count)
161 list_add_tail(&buf->buff_list, &dev->free_buff_list); 161 list_add_tail(&buf->buff_list, &dev->free_buff_list);
162 } 162 }
163 return 0; 163 return 0;
164exit_urb_buffer:
165 usb_free_urb(urb);
166exit_urb:
167 kfree(buf);
164exit: 168exit:
165 hdpvr_free_buffers(dev); 169 hdpvr_free_buffers(dev);
166 return retval; 170 return retval;