diff options
author | Julia Lawall <julia@diku.dk> | 2011-12-23 12:39:30 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2012-01-04 18:52:42 -0500 |
commit | 30a0dee7806d099c709603e65aa08be0363ea49d (patch) | |
tree | 4e69890a6d5b7df034efecd773cf212aa078f679 | |
parent | 3c8c9316710b83e906e425024153bf0929887b59 (diff) |
drivers/usb/host/isp1760-if.c: introduce missing kfree
drvdata needds to be freed before leaving the function in an error case.
A simplified version of the semantic match that finds the problem is as
follows: (http://coccinelle.lip6.fr)
// <smpl>
@r exists@
local idexpression x;
statement S;
identifier f1;
position p1,p2;
expression *ptr != NULL;
@@
x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...);
...
if (x == NULL) S
<... when != x
when != if (...) { <+...x...+> }
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: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/usb/host/isp1760-if.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c index b605224fb9e3..61de62cdb1dd 100644 --- a/drivers/usb/host/isp1760-if.c +++ b/drivers/usb/host/isp1760-if.c | |||
@@ -56,14 +56,18 @@ static int of_isp1760_probe(struct platform_device *dev) | |||
56 | return -ENOMEM; | 56 | return -ENOMEM; |
57 | 57 | ||
58 | ret = of_address_to_resource(dp, 0, &memory); | 58 | ret = of_address_to_resource(dp, 0, &memory); |
59 | if (ret) | 59 | if (ret) { |
60 | return -ENXIO; | 60 | ret = -ENXIO; |
61 | goto free_data; | ||
62 | } | ||
61 | 63 | ||
62 | res_len = resource_size(&memory); | 64 | res_len = resource_size(&memory); |
63 | 65 | ||
64 | res = request_mem_region(memory.start, res_len, dev_name(&dev->dev)); | 66 | res = request_mem_region(memory.start, res_len, dev_name(&dev->dev)); |
65 | if (!res) | 67 | if (!res) { |
66 | return -EBUSY; | 68 | ret = -EBUSY; |
69 | goto free_data; | ||
70 | } | ||
67 | 71 | ||
68 | if (of_irq_map_one(dp, 0, &oirq)) { | 72 | if (of_irq_map_one(dp, 0, &oirq)) { |
69 | ret = -ENODEV; | 73 | ret = -ENODEV; |
@@ -125,6 +129,7 @@ free_gpio: | |||
125 | gpio_free(drvdata->rst_gpio); | 129 | gpio_free(drvdata->rst_gpio); |
126 | release_reg: | 130 | release_reg: |
127 | release_mem_region(memory.start, res_len); | 131 | release_mem_region(memory.start, res_len); |
132 | free_data: | ||
128 | kfree(drvdata); | 133 | kfree(drvdata); |
129 | return ret; | 134 | return ret; |
130 | } | 135 | } |