aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorJulia Lawall <julia@diku.dk>2011-12-26 12:38:01 -0500
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-01-09 13:24:05 -0500
commitaf32b36095147e1828496b58987c1e24ef40487d (patch)
tree377f57e77ef19d5b4dd206c343259cc8a5e6a207 /drivers/mtd
parent775c32208708de3e2e2379c85e429ab11957f864 (diff)
mtd: lantiq-flash: drop iounmap for devm_ allocated data
Data allocated with devm_ioremap or devm_ioremap_nocache should not be freed using iounmap, because doing so causes a dangling pointer, and a subsequent double free. The semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // <smpl> @r@ expression x; @@ ( x = devm_ioremap(...) | x = devm_ioremap_nocache(...) ) @@ expression r.x; @@ * iounmap(x) // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/maps/lantiq-flash.c6
1 files changed, 1 insertions, 5 deletions
diff --git a/drivers/mtd/maps/lantiq-flash.c b/drivers/mtd/maps/lantiq-flash.c
index 4f10e27ada5..7b889de9477 100644
--- a/drivers/mtd/maps/lantiq-flash.c
+++ b/drivers/mtd/maps/lantiq-flash.c
@@ -159,7 +159,7 @@ ltq_mtd_probe(struct platform_device *pdev)
159 if (!ltq_mtd->mtd) { 159 if (!ltq_mtd->mtd) {
160 dev_err(&pdev->dev, "probing failed\n"); 160 dev_err(&pdev->dev, "probing failed\n");
161 err = -ENXIO; 161 err = -ENXIO;
162 goto err_unmap; 162 goto err_free;
163 } 163 }
164 164
165 ltq_mtd->mtd->owner = THIS_MODULE; 165 ltq_mtd->mtd->owner = THIS_MODULE;
@@ -179,8 +179,6 @@ ltq_mtd_probe(struct platform_device *pdev)
179 179
180err_destroy: 180err_destroy:
181 map_destroy(ltq_mtd->mtd); 181 map_destroy(ltq_mtd->mtd);
182err_unmap:
183 iounmap(ltq_mtd->map->virt);
184err_free: 182err_free:
185 kfree(ltq_mtd->map); 183 kfree(ltq_mtd->map);
186err_out: 184err_out:
@@ -198,8 +196,6 @@ ltq_mtd_remove(struct platform_device *pdev)
198 mtd_device_unregister(ltq_mtd->mtd); 196 mtd_device_unregister(ltq_mtd->mtd);
199 map_destroy(ltq_mtd->mtd); 197 map_destroy(ltq_mtd->mtd);
200 } 198 }
201 if (ltq_mtd->map->virt)
202 iounmap(ltq_mtd->map->virt);
203 kfree(ltq_mtd->map); 199 kfree(ltq_mtd->map);
204 kfree(ltq_mtd); 200 kfree(ltq_mtd);
205 } 201 }