diff options
| author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2009-03-10 15:55:55 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-10 18:55:11 -0400 |
| commit | d58ab5cf09679d8cb4824e22cae900c0eab5ab31 (patch) | |
| tree | 090e82a516fe8db760a1b7514ed072bb458c1e2f | |
| parent | 9c1e8a4ebcc04226cb6f3a1bf1d72f4cafd6b089 (diff) | |
mtd: physmap: fix NULL pointer dereference in error path
commit e480814f138cd5d78a8efe397756ba6b6518fdb6 ("[MTD] [MAPS] physmap:
fix wrong free and del_mtd_{partition,device}") introduces a NULL pointer
dereference in physmap_flash_remove when called from the error path in
physmap_flash_probe (if map_probe failed).
Call del_mtd_{partition,device} only if info->cmtd was not NULL.
Reported-by: pHilipp Zabel <philipp.zabel@gmail.com>
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/mtd/maps/physmap.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c index 4b122e7ab4b3..229718222db7 100644 --- a/drivers/mtd/maps/physmap.c +++ b/drivers/mtd/maps/physmap.c | |||
| @@ -46,16 +46,19 @@ static int physmap_flash_remove(struct platform_device *dev) | |||
| 46 | 46 | ||
| 47 | physmap_data = dev->dev.platform_data; | 47 | physmap_data = dev->dev.platform_data; |
| 48 | 48 | ||
| 49 | if (info->cmtd) { | ||
| 49 | #ifdef CONFIG_MTD_PARTITIONS | 50 | #ifdef CONFIG_MTD_PARTITIONS |
| 50 | if (info->nr_parts) { | 51 | if (info->nr_parts || physmap_data->nr_parts) |
| 51 | del_mtd_partitions(info->cmtd); | 52 | del_mtd_partitions(info->cmtd); |
| 52 | kfree(info->parts); | 53 | else |
| 53 | } else if (physmap_data->nr_parts) | 54 | del_mtd_device(info->cmtd); |
| 54 | del_mtd_partitions(info->cmtd); | ||
| 55 | else | ||
| 56 | del_mtd_device(info->cmtd); | ||
| 57 | #else | 55 | #else |
| 58 | del_mtd_device(info->cmtd); | 56 | del_mtd_device(info->cmtd); |
| 57 | #endif | ||
| 58 | } | ||
| 59 | #ifdef CONFIG_MTD_PARTITIONS | ||
| 60 | if (info->nr_parts) | ||
| 61 | kfree(info->parts); | ||
| 59 | #endif | 62 | #endif |
| 60 | 63 | ||
| 61 | #ifdef CONFIG_MTD_CONCAT | 64 | #ifdef CONFIG_MTD_CONCAT |
