diff options
author | Julia Lawall <julia@diku.dk> | 2009-11-21 06:49:41 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-12-05 15:41:45 -0500 |
commit | cd0e280f1bbecebcd20ed0ddd4dd8fb03a506b3c (patch) | |
tree | d2dc56a3b69eb7b77cfb9d0dc122329f7e17aae7 /drivers/media | |
parent | c95a419a5604ec8a23cd73f61e9bb151e8cbe89b (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>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/hdpvr/hdpvr-video.c | 8 |
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; |
164 | exit_urb_buffer: | ||
165 | usb_free_urb(urb); | ||
166 | exit_urb: | ||
167 | kfree(buf); | ||
164 | exit: | 168 | exit: |
165 | hdpvr_free_buffers(dev); | 169 | hdpvr_free_buffers(dev); |
166 | return retval; | 170 | return retval; |