mtd: cmdlinepart: fix the overflow of big mtd partitions
authorHuang Shijie <b32955@freescale.com>
Thu, 1 Nov 2012 05:58:17 +0000 (13:58 +0800)
committerArtem Bityutskiy <Artem.Bityutskiy@linux.intel.com>
Thu, 15 Nov 2012 17:50:30 +0000 (19:50 +0200)
When the kernel parses the following cmdline

#mtdparts=gpmi-nand:16m(boot),16m(kernel),1g(home),4g(test),-(usr)

for a big nand chip Micron MT29F64G08AFAAAWP(8GB), we got the following wrong
result:

.............................................
"mtd: partition size too small (0)"
.............................................

We can not get any partition.

The "4g(test)" partition triggers a overflow of the "size". The memparse()
returns 4g to the "size", but the size is "unsigned long" type, so a overflow
occurs, the "size" becomes zero in the end.

This patch changes the "size"/"offset" to "unsigned long long" type,
and replaces the UINT_MAX with ULLONG_MAX for macros SIZE_REMAINING and
OFFSET_CONTINUOUS.

Signed-off-by: Huang Shijie <b32955@freescale.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
drivers/mtd/cmdlinepart.c

index 4baab3bc61367fb5d3d00855c2e8ac36b065d947..c533f27d863f3cc44f11c212a2f326c38df7fc57 100644 (file)
@@ -56,8 +56,8 @@
 
 
 /* special size referring to all the remaining space in a partition */
-#define SIZE_REMAINING UINT_MAX
-#define OFFSET_CONTINUOUS UINT_MAX
+#define SIZE_REMAINING ULLONG_MAX
+#define OFFSET_CONTINUOUS ULLONG_MAX
 
 struct cmdline_mtd_partition {
        struct cmdline_mtd_partition *next;
@@ -89,7 +89,7 @@ static struct mtd_partition * newpart(char *s,
                                      int extra_mem_size)
 {
        struct mtd_partition *parts;
-       unsigned long size, offset = OFFSET_CONTINUOUS;
+       unsigned long long size, offset = OFFSET_CONTINUOUS;
        char *name;
        int name_len;
        unsigned char *extra_mem;
@@ -104,7 +104,8 @@ static struct mtd_partition * newpart(char *s,
        } else {
                size = memparse(s, &s);
                if (size < PAGE_SIZE) {
-                       printk(KERN_ERR ERRP "partition size too small (%lx)\n", size);
+                       printk(KERN_ERR ERRP "partition size too small (%llx)\n",
+                              size);
                        return ERR_PTR(-EINVAL);
                }
        }
@@ -296,7 +297,7 @@ static int parse_cmdline_partitions(struct mtd_info *master,
                                    struct mtd_partition **pparts,
                                    struct mtd_part_parser_data *data)
 {
-       unsigned long offset;
+       unsigned long long offset;
        int i, err;
        struct cmdline_mtd_partition *part;
        const char *mtd_id = master->name;