[PATCH] Fix kfree usage in various mtd map remove functions
Phil Endecott
spam_from_linux_mtd at chezphil.org
Thu May 17 14:18:14 EDT 2007
The remove() functions in various mtd map drivers were incorrectly kfree()ing the struct
resource that they had passed to release_resource(), and/or failing to free the *_flash_info
structure. This looks like a typo which has gradually propogated by copy&paste into a number
of these drivers.
Since mtd drivers are rarely or never used as modules (they typically provide root filesystems)
it is unlikely that these code paths have ever been exercised. It also means that this patch
has not been tested by the author.
This patch is against 2.6.21.
Signed-off-by: Phil Endecott <spam_from_linux_mtd_patch at chezphil.org>
diff -Nur linux-arm-2.6.21/drivers/mtd/maps.orig/integrator-flash.c linux-arm-2.6.21/drivers/mtd/maps/integrator-flash.c
--- linux-arm-2.6.21/drivers/mtd/maps.orig/integrator-flash.c 2007-05-17 18:56:10.000000000 +0100
+++ linux-arm-2.6.21/drivers/mtd/maps/integrator-flash.c 2007-05-17 18:58:16.000000000 +0100
@@ -174,7 +174,6 @@
iounmap(info->map.virt);
release_resource(info->res);
- kfree(info->res);
if (info->plat && info->plat->exit)
info->plat->exit();
diff -Nur linux-arm-2.6.21/drivers/mtd/maps.orig/ixp2000.c linux-arm-2.6.21/drivers/mtd/maps/ixp2000.c
--- linux-arm-2.6.21/drivers/mtd/maps.orig/ixp2000.c 2007-05-17 18:56:10.000000000 +0100
+++ linux-arm-2.6.21/drivers/mtd/maps/ixp2000.c 2007-05-17 18:57:29.000000000 +0100
@@ -129,10 +129,10 @@
kfree(info->partitions);
- if (info->res) {
+ if (info->res)
release_resource(info->res);
- kfree(info->res);
- }
+
+ kfree(info);
if (plat->exit)
plat->exit();
diff -Nur linux-arm-2.6.21/drivers/mtd/maps.orig/ixp4xx.c linux-arm-2.6.21/drivers/mtd/maps/ixp4xx.c
--- linux-arm-2.6.21/drivers/mtd/maps.orig/ixp4xx.c 2007-05-17 18:56:10.000000000 +0100
+++ linux-arm-2.6.21/drivers/mtd/maps/ixp4xx.c 2007-05-17 18:57:02.000000000 +0100
@@ -172,10 +172,10 @@
kfree(info->partitions);
- if (info->res) {
+ if (info->res)
release_resource(info->res);
- kfree(info->res);
- }
+
+ kfree(info);
if (plat->exit)
plat->exit();
Binary files linux-arm-2.6.21/drivers/mtd/maps.orig/ixp4xx.o and linux-arm-2.6.21/drivers/mtd/maps/ixp4xx.o differ
diff -Nur linux-arm-2.6.21/drivers/mtd/maps.orig/physmap.c linux-arm-2.6.21/drivers/mtd/maps/physmap.c
--- linux-arm-2.6.21/drivers/mtd/maps.orig/physmap.c 2007-05-17 18:56:10.000000000 +0100
+++ linux-arm-2.6.21/drivers/mtd/maps/physmap.c 2007-05-17 18:59:20.000000000 +0100
@@ -64,10 +64,10 @@
if (info->map.virt != NULL)
iounmap(info->map.virt);
- if (info->res != NULL) {
+ if (info->res)
release_resource(info->res);
- kfree(info->res);
- }
+
+ kfree(info);
return 0;
}
diff -Nur linux-arm-2.6.21/drivers/mtd/maps.orig/physmap_of.c linux-arm-2.6.21/drivers/mtd/maps/physmap_of.c
--- linux-arm-2.6.21/drivers/mtd/maps.orig/physmap_of.c 2007-05-17 18:56:10.000000000 +0100
+++ linux-arm-2.6.21/drivers/mtd/maps/physmap_of.c 2007-05-17 18:59:57.000000000 +0100
@@ -107,10 +107,10 @@
if (info->map.virt != NULL)
iounmap(info->map.virt);
- if (info->res != NULL) {
+ if (info->res)
release_resource(info->res);
- kfree(info->res);
- }
+
+ kfree(info);
return 0;
}
More information about the linux-mtd
mailing list