diff options
author | Julia Lawall <julia@diku.dk> | 2011-08-07 21:18:00 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2011-09-19 19:19:49 -0400 |
commit | 7a19081fc2658157a1b84e6f3288450c33d98569 (patch) | |
tree | d76a01044ddba8ce3136729b217706663055db75 | |
parent | 6dece0eb69b2a28e18d104bc5d707f1cb673f5e0 (diff) |
pseries/iommu: Add missing kfree
At this point, window has not been stored anywhere, so it has to be freed
before leaving the function.
A simplified version of the semantic match that finds this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@exists@
local idexpression x;
statement S,S1;
expression E;
identifier fl;
expression *ptr != NULL;
@@
x = \(kmalloc\|kzalloc\|kcalloc\)(...);
...
if (x == NULL) S
<... when != x
when != if (...) { <+...kfree(x)...+> }
when any
when != true x == NULL
x->fl
...>
(
if (x == NULL) S1
|
if (...) { ... when != x
when forall
(
return \(0\|<+...x...+>\|ptr\);
|
* return ...;
)
}
)
// </smpl>
Signed-off-by: Julia Lawall <julia@diku.dk>
Acked-by: Nishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/platforms/pseries/iommu.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index 9f121a37eb51..5905a3b9f7e6 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -939,14 +939,14 @@ static u64 enable_ddw(struct pci_dev *dev, struct device_node *pdn) | |||
939 | if (ret) { | 939 | if (ret) { |
940 | dev_info(&dev->dev, "failed to map direct window for %s: %d\n", | 940 | dev_info(&dev->dev, "failed to map direct window for %s: %d\n", |
941 | dn->full_name, ret); | 941 | dn->full_name, ret); |
942 | goto out_clear_window; | 942 | goto out_free_window; |
943 | } | 943 | } |
944 | 944 | ||
945 | ret = prom_add_property(pdn, win64); | 945 | ret = prom_add_property(pdn, win64); |
946 | if (ret) { | 946 | if (ret) { |
947 | dev_err(&dev->dev, "unable to add dma window property for %s: %d", | 947 | dev_err(&dev->dev, "unable to add dma window property for %s: %d", |
948 | pdn->full_name, ret); | 948 | pdn->full_name, ret); |
949 | goto out_clear_window; | 949 | goto out_free_window; |
950 | } | 950 | } |
951 | 951 | ||
952 | window->device = pdn; | 952 | window->device = pdn; |
@@ -958,6 +958,9 @@ static u64 enable_ddw(struct pci_dev *dev, struct device_node *pdn) | |||
958 | dma_addr = of_read_number(&create.addr_hi, 2); | 958 | dma_addr = of_read_number(&create.addr_hi, 2); |
959 | goto out_unlock; | 959 | goto out_unlock; |
960 | 960 | ||
961 | out_free_window: | ||
962 | kfree(window); | ||
963 | |||
961 | out_clear_window: | 964 | out_clear_window: |
962 | remove_ddw(pdn); | 965 | remove_ddw(pdn); |
963 | 966 | ||