diff options
| author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2008-12-01 17:23:39 -0500 |
|---|---|---|
| committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-12-10 11:10:27 -0500 |
| commit | 176bf2e0f10ecf1d20a97db3bd5bb2e6ba0b5668 (patch) | |
| tree | b22f94dcce76c35f2c5ebe1bda5508e61e46da4f /drivers/mtd/maps/physmap.c | |
| parent | 002f6aab43c0e556ee5f588d138587de6a3ed63d (diff) | |
[MTD] physmap: fix leak of memory returned by parse_mtd_partitions
The mtd partition parser returns an allocated pointer array of
mtd_partition. The caller must free it. The array is used only for
add_mtd_partitions(), so free it just after the call.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: Mike Frysinger <vapier.adi@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/maps/physmap.c')
| -rw-r--r-- | drivers/mtd/maps/physmap.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c index 876dfab9284..58207b3b941 100644 --- a/drivers/mtd/maps/physmap.c +++ b/drivers/mtd/maps/physmap.c | |||
| @@ -29,7 +29,6 @@ struct physmap_flash_info { | |||
| 29 | struct map_info map[MAX_RESOURCES]; | 29 | struct map_info map[MAX_RESOURCES]; |
| 30 | #ifdef CONFIG_MTD_PARTITIONS | 30 | #ifdef CONFIG_MTD_PARTITIONS |
| 31 | int nr_parts; | 31 | int nr_parts; |
| 32 | struct mtd_partition *parts; | ||
| 33 | #endif | 32 | #endif |
| 34 | }; | 33 | }; |
| 35 | 34 | ||
| @@ -56,14 +55,10 @@ static int physmap_flash_remove(struct platform_device *dev) | |||
| 56 | for (i = 0; i < MAX_RESOURCES; i++) { | 55 | for (i = 0; i < MAX_RESOURCES; i++) { |
| 57 | if (info->mtd[i] != NULL) { | 56 | if (info->mtd[i] != NULL) { |
| 58 | #ifdef CONFIG_MTD_PARTITIONS | 57 | #ifdef CONFIG_MTD_PARTITIONS |
| 59 | if (info->nr_parts) { | 58 | if (info->nr_parts || physmap_data->nr_parts) |
| 60 | del_mtd_partitions(info->mtd[i]); | 59 | del_mtd_partitions(info->mtd[i]); |
| 61 | kfree(info->parts); | 60 | else |
| 62 | } else if (physmap_data->nr_parts) { | ||
| 63 | del_mtd_partitions(info->mtd[i]); | ||
| 64 | } else { | ||
| 65 | del_mtd_device(info->mtd[i]); | 61 | del_mtd_device(info->mtd[i]); |
| 66 | } | ||
| 67 | #else | 62 | #else |
| 68 | del_mtd_device(info->mtd[i]); | 63 | del_mtd_device(info->mtd[i]); |
| 69 | #endif | 64 | #endif |
| @@ -86,6 +81,9 @@ static int physmap_flash_probe(struct platform_device *dev) | |||
| 86 | int err = 0; | 81 | int err = 0; |
| 87 | int i; | 82 | int i; |
| 88 | int devices_found = 0; | 83 | int devices_found = 0; |
| 84 | #ifdef CONFIG_MTD_PARTITIONS | ||
| 85 | struct mtd_partition *parts; | ||
| 86 | #endif | ||
| 89 | 87 | ||
| 90 | physmap_data = dev->dev.platform_data; | 88 | physmap_data = dev->dev.platform_data; |
| 91 | if (physmap_data == NULL) | 89 | if (physmap_data == NULL) |
| @@ -163,9 +161,10 @@ static int physmap_flash_probe(struct platform_device *dev) | |||
| 163 | goto err_out; | 161 | goto err_out; |
| 164 | 162 | ||
| 165 | #ifdef CONFIG_MTD_PARTITIONS | 163 | #ifdef CONFIG_MTD_PARTITIONS |
| 166 | err = parse_mtd_partitions(info->cmtd, part_probe_types, &info->parts, 0); | 164 | err = parse_mtd_partitions(info->cmtd, part_probe_types, &parts, 0); |
| 167 | if (err > 0) { | 165 | if (err > 0) { |
| 168 | add_mtd_partitions(info->cmtd, info->parts, err); | 166 | add_mtd_partitions(info->cmtd, parts, err); |
| 167 | kfree(parts); | ||
| 169 | return 0; | 168 | return 0; |
| 170 | } | 169 | } |
| 171 | 170 | ||
