diff options
author | Julia Lawall <julia@diku.dk> | 2009-09-22 19:46:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 10:39:45 -0400 |
commit | 971370cc18ae13e87b68ba1769cbad497fa4ab98 (patch) | |
tree | 504132c3cff85e4ed0d719e7d93ae1bafb914872 /drivers/rtc | |
parent | 72445af880dbcd41cffd0d7b78a8c74da093e9eb (diff) |
drivers/rtc: introduce missing kfree
Error handling code following a kzalloc should free the allocated data.
The semantic match that finds the 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>
Cc: David Brownell <david-b@pacbell.net>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/rtc-ep93xx.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/rtc/rtc-ep93xx.c b/drivers/rtc/rtc-ep93xx.c index 551332e4ed02..9da02d108b73 100644 --- a/drivers/rtc/rtc-ep93xx.c +++ b/drivers/rtc/rtc-ep93xx.c | |||
@@ -128,12 +128,16 @@ static int __init ep93xx_rtc_probe(struct platform_device *pdev) | |||
128 | return -ENOMEM; | 128 | return -ENOMEM; |
129 | 129 | ||
130 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 130 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
131 | if (res == NULL) | 131 | if (res == NULL) { |
132 | return -ENXIO; | 132 | err = -ENXIO; |
133 | goto fail_free; | ||
134 | } | ||
133 | 135 | ||
134 | res = request_mem_region(res->start, resource_size(res), pdev->name); | 136 | res = request_mem_region(res->start, resource_size(res), pdev->name); |
135 | if (res == NULL) | 137 | if (res == NULL) { |
136 | return -EBUSY; | 138 | err = -EBUSY; |
139 | goto fail_free; | ||
140 | } | ||
137 | 141 | ||
138 | ep93xx_rtc->mmio_base = ioremap(res->start, resource_size(res)); | 142 | ep93xx_rtc->mmio_base = ioremap(res->start, resource_size(res)); |
139 | if (ep93xx_rtc->mmio_base == NULL) { | 143 | if (ep93xx_rtc->mmio_base == NULL) { |
@@ -169,6 +173,8 @@ fail: | |||
169 | pdev->dev.platform_data = NULL; | 173 | pdev->dev.platform_data = NULL; |
170 | } | 174 | } |
171 | release_mem_region(res->start, resource_size(res)); | 175 | release_mem_region(res->start, resource_size(res)); |
176 | fail_free: | ||
177 | kfree(ep93xx_rtc); | ||
172 | return err; | 178 | return err; |
173 | } | 179 | } |
174 | 180 | ||