mtd: physmap: fix NULL pointer dereference in error path
[sfrench/cifs-2.6.git] / drivers / mtd / maps / physmap.c
index 1db16e549e38422ddb9cc6dee3707a1f00b5195a..229718222db710e27fc980fb68ca287d9553e99d 100644 (file)
@@ -46,34 +46,39 @@ static int physmap_flash_remove(struct platform_device *dev)
 
        physmap_data = dev->dev.platform_data;
 
-#ifdef CONFIG_MTD_CONCAT
-       if (info->cmtd != info->mtd[0]) {
+       if (info->cmtd) {
+#ifdef CONFIG_MTD_PARTITIONS
+               if (info->nr_parts || physmap_data->nr_parts)
+                       del_mtd_partitions(info->cmtd);
+               else
+                       del_mtd_device(info->cmtd);
+#else
                del_mtd_device(info->cmtd);
-               mtd_concat_destroy(info->cmtd);
+#endif
        }
+#ifdef CONFIG_MTD_PARTITIONS
+       if (info->nr_parts)
+               kfree(info->parts);
 #endif
 
-       for (i = 0; i < MAX_RESOURCES; i++) {
-               if (info->mtd[i] != NULL) {
-#ifdef CONFIG_MTD_PARTITIONS
-                       if (info->nr_parts) {
-                               del_mtd_partitions(info->mtd[i]);
-                               kfree(info->parts);
-                       } else if (physmap_data->nr_parts) {
-                               del_mtd_partitions(info->mtd[i]);
-                       } else {
-                               del_mtd_device(info->mtd[i]);
-                       }
-#else
-                       del_mtd_device(info->mtd[i]);
+#ifdef CONFIG_MTD_CONCAT
+       if (info->cmtd != info->mtd[0])
+               mtd_concat_destroy(info->cmtd);
 #endif
+
+       for (i = 0; i < MAX_RESOURCES; i++) {
+               if (info->mtd[i] != NULL)
                        map_destroy(info->mtd[i]);
-               }
        }
        return 0;
 }
 
-static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", NULL };
+static const char *rom_probe_types[] = {
+                                       "cfi_probe",
+                                       "jedec_probe",
+                                       "qinfo_probe",
+                                       "map_rom",
+                                       NULL };
 #ifdef CONFIG_MTD_PARTITIONS
 static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
 #endif
@@ -119,6 +124,7 @@ static int physmap_flash_probe(struct platform_device *dev)
                info->map[i].size = dev->resource[i].end - dev->resource[i].start + 1;
                info->map[i].bankwidth = physmap_data->width;
                info->map[i].set_vpp = physmap_data->set_vpp;
+               info->map[i].pfow_base = physmap_data->pfow_base;
 
                info->map[i].virt = devm_ioremap(&dev->dev, info->map[i].phys,
                                                 info->map[i].size);
@@ -163,9 +169,11 @@ static int physmap_flash_probe(struct platform_device *dev)
                goto err_out;
 
 #ifdef CONFIG_MTD_PARTITIONS
-       err = parse_mtd_partitions(info->cmtd, part_probe_types, &info->parts, 0);
+       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;
        }
 
@@ -251,14 +259,7 @@ static struct platform_driver physmap_flash_driver = {
 };
 
 
-#ifdef CONFIG_MTD_PHYSMAP_LEN
-#if CONFIG_MTD_PHYSMAP_LEN != 0
-#warning using PHYSMAP compat code
-#define PHYSMAP_COMPAT
-#endif
-#endif
-
-#ifdef PHYSMAP_COMPAT
+#ifdef CONFIG_MTD_PHYSMAP_COMPAT
 static struct physmap_flash_data physmap_flash_data = {
        .width          = CONFIG_MTD_PHYSMAP_BANKWIDTH,
 };
@@ -302,7 +303,7 @@ static int __init physmap_init(void)
        int err;
 
        err = platform_driver_register(&physmap_flash_driver);
-#ifdef PHYSMAP_COMPAT
+#ifdef CONFIG_MTD_PHYSMAP_COMPAT
        if (err == 0)
                platform_device_register(&physmap_flash);
 #endif
@@ -312,7 +313,7 @@ static int __init physmap_init(void)
 
 static void __exit physmap_exit(void)
 {
-#ifdef PHYSMAP_COMPAT
+#ifdef CONFIG_MTD_PHYSMAP_COMPAT
        platform_device_unregister(&physmap_flash);
 #endif
        platform_driver_unregister(&physmap_flash_driver);
@@ -326,8 +327,7 @@ MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
 MODULE_DESCRIPTION("Generic configurable MTD map driver");
 
 /* legacy platform drivers can't hotplug or coldplg */
-#ifndef PHYSMAP_COMPAT
+#ifndef CONFIG_MTD_PHYSMAP_COMPAT
 /* work with hotplug and coldplug */
 MODULE_ALIAS("platform:physmap-flash");
 #endif
-