mtd: Fix compile failure and error path in physmap.c
authorH Hartley Sweeten <hartleys@visionengravers.com>
Tue, 20 Oct 2009 16:23:33 +0000 (12:23 -0400)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Tue, 20 Oct 2009 21:29:27 +0000 (06:29 +0900)
Commit 4b56ffcacee937a85bf39e14872dd141e23ee85f ("mtd: Fix kernel NULL
pointer dereference in physmap.c") introduced a couple of bugs.

It neglected to run the loop of map_destroy() calls in
physmap_flash_remove(), if !info->cmtd, which would happen if that
function was called to clean up errors during probe.

It also failed to compile if CONFIG_MTD_PARTITIONS was not defined.

Reported-By: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/maps/physmap.c

index 65f52d4804a28b07aa691175e5a26818c3277ac5..3f13a9673e7f4b94fc298cb8f0ff3450a1d16a7b 100644 (file)
@@ -44,12 +44,10 @@ static int physmap_flash_remove(struct platform_device *dev)
                return 0;
        platform_set_drvdata(dev, NULL);
 
-       if (info->cmtd == NULL)
-               return 0;
-
        physmap_data = dev->dev.platform_data;
 
-       if (mtd_has_partitions()) {
+       if (info->cmtd) {
+#ifdef CONFIG_MTD_PARTITIONS
                if (info->nr_parts || physmap_data->nr_parts) {
                        del_mtd_partitions(info->cmtd);
 
@@ -58,14 +56,14 @@ static int physmap_flash_remove(struct platform_device *dev)
                } else {
                        del_mtd_device(info->cmtd);
                }
-       } else {
+#else
                del_mtd_device(info->cmtd);
-       }
-
+#endif
 #ifdef CONFIG_MTD_CONCAT
-       if (info->cmtd != info->mtd[0])
-               mtd_concat_destroy(info->cmtd);
+               if (info->cmtd != info->mtd[0])
+                       mtd_concat_destroy(info->cmtd);
 #endif
+       }
 
        for (i = 0; i < MAX_RESOURCES; i++) {
                if (info->mtd[i] != NULL)
@@ -170,22 +168,22 @@ static int physmap_flash_probe(struct platform_device *dev)
        if (err)
                goto err_out;
 
-       if (mtd_has_partitions()) {
-               err = parse_mtd_partitions(info->cmtd, part_probe_types,
-                                       &info->parts, 0);
-               if (err > 0) {
-                       add_mtd_partitions(info->cmtd, info->parts, err);
-                       info->nr_parts = err;
-                       return 0;
-               }
+#ifdef CONFIG_MTD_PARTITIONS
+       err = parse_mtd_partitions(info->cmtd, part_probe_types,
+                               &info->parts, 0);
+       if (err > 0) {
+               add_mtd_partitions(info->cmtd, info->parts, err);
+               info->nr_parts = err;
+               return 0;
+       }
 
-               if (physmap_data->nr_parts) {
-                       printk(KERN_NOTICE "Using physmap partition information\n");
-                       add_mtd_partitions(info->cmtd, physmap_data->parts,
-                                       physmap_data->nr_parts);
-                       return 0;
-               }
+       if (physmap_data->nr_parts) {
+               printk(KERN_NOTICE "Using physmap partition information\n");
+               add_mtd_partitions(info->cmtd, physmap_data->parts,
+                                  physmap_data->nr_parts);
+               return 0;
        }
+#endif
 
        add_mtd_device(info->cmtd);
        return 0;